Эх сурвалжийг харах

性能验证模块 开发 (二期) / 添加正确度-患者样本 结论模板内容

liyuan 1 жил өмнө
parent
commit
0746ac96a3

+ 1 - 1
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/components/verification/model2/PVModel.java

@@ -257,7 +257,7 @@ public abstract class PVModel {
     }
 
     protected String renderChartTemplate(Object ctx, int index, String filePath) {
-        return renderTemplate(ctx, chartNames.get(index) + "Chart", filePath);
+        return renderTemplate(ctx, cfg != null?chartNames.get(index) + "Chart":null, filePath);
     }
 
     protected String renderReportTemplate(Object ctx, String filePath) {

+ 28 - 28
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/components/verification/model2/TruenessEP15Patient.java

@@ -5,6 +5,8 @@ import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.lc.ibps.components.verification.model.InspectionConfigVO;
 import com.lc.ibps.components.verification.report.ChartDTO;
 import com.lc.ibps.components.verification.report.TableDTO;
+import org.apache.commons.math3.linear.MatrixUtils;
+import org.apache.commons.math3.linear.RealMatrix;
 import org.apache.commons.math3.stat.StatUtils;
 import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
 
@@ -15,6 +17,7 @@ public class TruenessEP15Patient extends PVModel {
     private final double[] y;
     //样本的标示值/理论值 x
     private final double[] x;
+    private final double rejectionRate;
     private double[] yx;
     private double[] yxb;
 
@@ -33,17 +36,15 @@ public class TruenessEP15Patient extends PVModel {
 
     public TruenessEP15Patient(double[][] data, InspectionConfigVO configVO) {
         super(data, configVO);
-        this.y = data[0];
-        this.x = data[1];
+        final RealMatrix realMatrix = MatrixUtils.createRealMatrix(data);
+        this.y = realMatrix.getColumn(0);
+        this.x = realMatrix.getColumn(1);
         meanX = StatUtils.mean(x);
         meanY = StatUtils.mean(y);
-//        if(t == 0){
-        this.t = getTValue(this.y.length - 1, 0.01);
-//        }else {
-//            this.t = t;
-//        }
         this.n = this.y.length;
         this.sdClaim = configVO.getClaimValue();
+        this.rejectionRate = (double)configVO.getRejectionRate()/100;
+        this.t = getTValue(this.y.length - 1, rejectionRate);
     }
 
     @Override
@@ -157,7 +158,11 @@ public class TruenessEP15Patient extends PVModel {
         this.sdClaim = sdClaim;
     }
 
-    public double[][] getData() {
+    public double getRejectionRate() {
+        return rejectionRate;
+    }
+
+    public double[][] getReportData() {
 
         double[][] d = new double[y.length][5];
         for (int i = 0; i < y.length; i++) {
@@ -175,32 +180,27 @@ public class TruenessEP15Patient extends PVModel {
         TableDTO table = new TableDTO();
         String[] header = {"次数", "Y (实验方法)", "X (比较方法)", "Y<sub>i</sub>-X<sub>i</sub>", "(Y<sub>i</sub>-X<sub>i</sub>-B)"};
         table.buildHeader(header);
-        table.buildData(getData(), getScale());
+        table.buildData(getReportData(), getScale());
         return table;
     }
 
     @Override
     TableDTO buildTable1DTO(int sheetIndex) {
         TableDTO table = new TableDTO();
-        String[][] data = new String[8][2];
-
-        data[0] = new String[]{"Y均值", format(meanY)};
-        data[1] = new String[]{"X均值", format(meanX)};
-        data[2] = new String[]{"差值(B)", format(bias)};
-        data[3] = new String[]{"差值标准差(SD<sub>diff</sub>)", format(sdDiff)};
-        data[4] = new String[]{"置信区间上限", format(ucl)};
-        data[5] = new String[]{"置信区间下限", format(lcl)};
-        data[6] = new String[]{"验证区间上限", format(uvl)};
-        data[7] = new String[]{"验证区间下限", format(lvl)};
-//        data[1] =new String[]{"批内方差 (V<sub>r</sub>)" , format(item.vr)};
-//        data[2] =new String[]{"批内标准差 (S<sub>r</sub>)" , format(item.sr)};
-//        data[3] =new String[]{"批内变异系数 (CV<sub>r</sub>)" , format(item.cvr)};
-//        data[4] =new String[]{"",""};
-//        data[5] =new String[]{"批间方差 (V<sub>b</sub>)" , format(item.vb)};
-////        data[4] =new String[]{"批间标准差 (S<sub>b</sub>)" , format(item.sb)};
-//        data[6] =new String[]{"实验室内标准差 (S<sub>1</sub>)" , format(item.s1)};
-//        data[7] =new String[]{"实验室变异系数 (CV)" , format(item.cv1)};
-        table.buildData(data);
+        String[] header = {"实验项目", "Y均值","X均值","差值(B)", "差值标准差(SD<sub>diff</sub>)", "验证区间", "厂家声称偏倚"};
+        table.buildHeader(header);
+
+        String[][] r = new String[1][7];
+
+        r[0][0] = getItemName();
+        r[0][1] = format(meanY);
+        r[0][2] = format(meanX);
+        r[0][3] = format(bias);
+        r[0][4] = format(sdDiff);
+        r[0][5] = String.format("%s %s ~ %s %s",format(lvl),getUnits(),format(uvl),getUnits());
+        r[0][6] = format(sdClaim);
+
+        table.buildData(r);
         return table;
     }
 

+ 1 - 1
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/components/verification/model2/TruenessReferneceItem.java

@@ -34,7 +34,7 @@ public class TruenessReferneceItem {
         }
         this.target = target;
         this.sdClaim = configVO.getClaimValue();
-        rejectionRate = (double)configVO.getRejectionRate()/100;
+        this.rejectionRate = (double)configVO.getRejectionRate()/100;
         if (t == 0) {
             this.t = PVModel.getTValue(calcData.length - 1, rejectionRate);
         } else {

+ 21 - 8
ibps-provider-root/modules/provider-business/src/main/resources/pv/report/truesnessUsingPatient.ftl

@@ -1,12 +1,25 @@
 <p>
-本实验中计算的差值为 ${bias} ${units},自由度为 N-1=${n-1},p=0.01的t临界值为 ${t},
-计算的 SD<sub>diff</sub>为${sdDiff} ${units},当N为${n},图4中,上限为${ucl} ${units},下限为${lcl} ${units}。
-如果厂家声明的差值(“偏倚”)为 ${sdClaim} ${units},
-以相同的方式可计算厂家声明的验证限,图4中可获得验证限为${lvl} ${units}~${uvl} ${units},
-实验室计算的差值(“偏倚”)${bias} ${units},
-    <#if (bias > uvl) || (bias < lvl)>
-其并没有落在验证限之中,因此这些实验数据不能证实正确度。
+厂家声明的差值(“偏倚”)为 ${sdClaim} ${units},实验室计算的差值(“偏倚”)${bias} ${units},
+    <#assign x = 1>
+    <#if (bias + sdClaim)?abs == (bias?abs + sdClaim?abs)>
+计算值正负号和厂家声称值一致,
+        <#if (bias?abs > sdClaim?abs)>
+但绝对值>厂家声称值,则需将计算值与验证区间比较。
+        <#else>
+绝对值≤厂家声称值,表明厂家声称值可靠,不需要计算验证值。
+            <#assign x = 0>
+        </#if >
     <#else>
-落在验证限之中,证明了厂家的声明。也就是置信限覆盖厂家的声明,因此它们也证明数据与厂家的声明一致。
+计算值正负号和厂家声称值不一致,则需将计算值与验证区间比较。
+    </#if>
+<br />
+    <#if (x > 0) >
+本实验中自由度为 ${n-1},p=${rejectionRate},计算T值为 ${t}, SD<sub>diff</sub>为${sdDiff} ${units}。
+计算验证限为${lvl} ${units}~${uvl} ${units},实验室计算的差值(“偏倚”)${bias} ${units},
+        <#if (bias > uvl) || (bias < lvl)>
+其并没有落在验证限之中,因此这些实验数据不能证实正确度。
+        <#else>
+落在验证限之中,证明了厂家的声明。
+        </#if>
     </#if>
 </p>

+ 26 - 34
ibps-provider-root/modules/provider-business/src/test/java/com/lc/ibps/components/verification/model2/TruenessEP15PatientTest.java

@@ -1,8 +1,13 @@
 package com.lc.ibps.components.verification.model2;
 
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.lc.ibps.components.verification.model.InspectionConfigVO;
+import com.lc.ibps.components.verification.report.ReportDataDTO;
+import com.lc.ibps.components.verification.report.ReportFactory;
 import com.lc.ibps.components.verification.report.SheetDTO;
 import com.lc.ibps.components.verification.report.TableDTO;
+import org.apache.commons.lang3.RandomUtils;
 import org.apache.commons.math3.linear.MatrixUtils;
 import org.apache.commons.math3.linear.RealMatrix;
 import org.apache.commons.math3.linear.RealMatrixFormat;
@@ -25,41 +30,28 @@ public class TruenessEP15PatientTest {
         InspectionConfigVO config = new InspectionConfigVO("EP15-A2方法学比对", 1, 20,
                 null, 1, LocalDate.now(), true);
         config.setMethodNum(2);
-        config.setClaimValue(3);
+        config.setClaimValue(0.022);
         config.setUnits("mmol/L");
+        config.setDecimal(3);
+        config.setRejectionRate(5);
         config.setKey(ModelEnum.TruenessEP15Patient.getKey());
-        double[][] data = {{125, 123},
-                {77, 74},
-                {320, 315},
-                {303, 296},
-                {29, 25},
-                {221, 218},
-                {44, 40},
-                {154, 154},
-                {388, 378},
-                {95, 94},
-                {238, 241},
-                {74, 71},
-                {310, 306},
-                {370, 370},
-                {100, 98},
-                {168, 162},
-                {54, 58},
-                {180, 183},
-                {210, 202},
-                {435, 430}};
-//        RealMatrix matrix = MatrixUtils.createRealMatrix(data);
-//        RealMatrixFormat matrixFormat = new RealMatrixFormat("", "", "", "\n",
-//                "", ",", new DecimalFormat("0.00"));
-//        System.out.println(matrixFormat.format(matrix));
-////        TruenessEP15Patient tr = new TruenessEP15Patient(transposeMatrix(data), config);
-//
-//        TableDTO tableDTO = tr.buildDataTableDTO();
-//        SheetDTO[] sheetDTOS = tr.buildSheetDTO();
-//        String s = tr.generateResult();
-//
-////        ChiSquaredDistribution x2 = new ChiSquaredDistribution( 10 );
-////        double result = x2.inverseCumulativeProbability(1 - 0.05/2);//level
-//        System.out.println(s);
+        RandomUtils.nextDouble();
+        double[][] data = new double[config.getSpecimensNum()][config.getMethodNum() ];
+        for (int i = 0; i < config.getSpecimensNum(); i++) {
+            for (int j = 0; j < config.getMethodNum() ; j++) {
+                data[i][j] = RandomUtils.nextDouble(3.12, 3.25);
+            }
+        }
+        RealMatrix matrix = MatrixUtils.createRealMatrix(data);
+        RealMatrixFormat matrixFormat = new RealMatrixFormat("", "", "", "\n",
+                "", ",", new DecimalFormat("0.00"));
+        System.out.println(matrixFormat.format(matrix));
+        PVItemBuilder pvItemBuilder = PVItemBuilder.getInstance(config);
+        pvItemBuilder.buildPVModel(data);
+        ReportDataDTO dataDTO = ReportFactory.build(pvItemBuilder);
+        String s = JSONObject.toJSONString(dataDTO, SerializerFeature.DisableCircularReferenceDetect);
+        String s1 = pvItemBuilder.getPvModel().generateResult();
+        System.out.println(s);
+        System.out.println(s1);
     }
 }