* References: * 1) Cornbleet, PJ, Gochman N. Incorrect least-square regression coefficients in * method-comparison analysis. Clin Chem, 1979; 25: 432-8 * 2) Linnet K. Estimation of the Linear Relationship Between the Measurements of Two * methods with Proportional Errors. Stat Med, 1990; 9: 1463-73. * 3) Linnet K. Evaluation of Regression Procedures for Methods Comparison Studies. * Clin Chem, 1993; 39(3): 424-32. * 4) Linnet K. Reference Manual CBStat 5.1 (1997-2004); p 23-32. ************************************************* * DEMING REGRESSION (UNWEIGHTED & WEIGHTED) * ************************************************* * All macros tested with SPSS 15 & PASW 17.0.2 * ************************************************* * (C) Marta García-Granero 04/30/2009 * * send questions to: mgarciagranero@gmail.com * * Downloaded from: http://gjyp.nl/marta/ * * Feel free to use or modify this code, but * * acknowledge the author and the web site * ************************************************* * The accuracy has been checked with MedCalc * * and Method Validator * ************************************************* * WARNING: variable names lenght should be only * * 8 characters at most (MATRIX limitation) * ************************************************* PRESERVE. SET RESULTS=NONE MESSAGES=NONE ERRORS=NONE. HOST COMMAND=['IF not exist C:\Temp MD C:\Temp']. RESTORE. ***************************************************** ***************** MACRO DEFINITIONS ***************** ***************************************************** * A) MACRO FOR UNWEIGHTED DEMING REGRESSION (SINGLE MEASUREMENTS, CONSTANT ERRORS) *. DEFINE DEMINGREG1 (x=!TOKENS(1) / y=!TOKENS(1) /lambda=!DEFAULT(1) !TOKENS(1)). DATASET NAME OriginalData. DATASET COPY WorkingData WINDOW=HIDDEN. DATASET DECLARE Parameters WINDOW=HIDDEN. DATASET ACTIVATE WorkingData. FREQUENCIES VARIABLES=!x !y /FORMAT=NOTABLE /STATISTICS=STDDEV SEMEAN MINIMUM MAXIMUM MEAN MEDIAN. SELECT IF (NOT MISSING(!x)) AND (NOT MISSING(!y)). RANK VARIABLES=!x(A) /N INTO N1@ /PRINT=NO . DO IF $casenum EQ 1. . COMPUTE TValue = IDF.T(0.975,N1@-2) . END IF. TEMPORARY. SET MXLOOPS=10000. MATRIX. PRINT /TITLE='****** UNWEIGHTED DEMING REGRESSION (WITH JACKKNIFE ESTIMATION OF SE&95%CI) ******'. GET T95 /VAR=TValue /MISSING=OMIT. * Compute user specified Lambda (variance ratio) *. COMPUTE L=!lambda. GET pair /VAR=!x !y /NAMES=vname /MISSING=OMIT. PRINT {T(vname)} /FORMAT='A8' /RLABELS='Method X','Method Y' /TITLE='Variables compared'. PRINT L /FORMAT='F8.3' /TITLE='Lambda (fixed by user)'. * 1st variable is X, 2nd is Y *. COMPUTE X=pair(:,1). COMPUTE Y=pair(:,2). COMPUTE n=NROW(pair). COMPUTE MeanX=CSUM(X)/n. COMPUTE MeanY=CSUM(Y)/n. COMPUTE u=CSSQ(X)-((CSUM(X))**2)/n. COMPUTE q=CSSQ(Y)-((CSUM(Y))**2)/n. COMPUTE p=CSUM(X&*Y)-CSUM(X)*CSUM(Y)/n. COMPUTE R=p/SQRT(u*q). COMPUTE b=((L*q-u)+SQRT((u-L*q)**2+4*L*p**2))/(2*L*p). COMPUTE a=MeanY. COMPUTE a0=a-b*MeanX. * Compute empty matrix to store JK statistics (a0i&bi) *. COMPUTE jack=MAKE(n,2,0). COMPUTE nj=n-1. * Cycle thru all values *. LOOP i=1 TO n. . DO IF (i EQ 1). /* JK sample for 1st position *. . COMPUTE sample=pair(2:n,:). . ELSE IF (i GT 1) AND (i LT n). /* JK samples for 2nd to last-1 postion *. . COMPUTE sample={pair(1:(i-1),:); pair((i+1):n,:)}. . ELSE IF (i EQ n). /* JK sample for last position *. . COMPUTE sample=pair(1:(n-1),:). . END IF. . COMPUTE Xi=sample(:,1). . COMPUTE Yi=sample(:,2). . COMPUTE MeanXi=CSUM(Xi)/nj. . COMPUTE MeanYi=CSUM(Yi)/nj. . COMPUTE ui=CSSQ(Xi)-((CSUM(Xi))**2)/nj. . COMPUTE qi=CSSQ(Yi)-((CSUM(Yi))**2)/nj. . COMPUTE pi=CSUM(Xi&*Yi)-CSUM(Xi)*CSUM(Yi)/nj. . COMPUTE ai=MeanYi. . COMPUTE bi=((L*qi-ui)+SQRT((ui-L*qi)**2+4*L*pi**2))/(2*L*pi). . COMPUTE jack(i,1)=n*(a-b*MeanX)-(n-1)*(ai-bi*MeanXi). . COMPUTE jack(i,2)=n*b-(n-1)*bi. END LOOP. COMPUTE MeanJack=CSUM(jack)/n. COMPUTE VarJack=(CSSQ(jack)-n*(MeanJack&**2))/(n-1). COMPUTE SEJack=SQRT(VarJack/n). COMPUTE Low={a0,b}-T95*SEJack. COMPUTE Upp={a0,b}+T95*SEJack. COMPUTE TValue=({a0,b}-{0,1})/SEJack. COMPUTE PValue=2*(1-TCDF(ABS(TValue),n-2)). PRINT {T({a0,b}),T(SEJack),T(Low),T(Upp),T(TValue),T(PValue)} /FORMAT='F8.5' /RLABEL='A=','B=' /CLABEL='Coeff.','SE(coef)','Low95%CL','Upp95%CL','T Value','2-tail p' /TITLE='Regression line & Jackknife estimators of SE & 95CI'. PRINT R /FORMAT='F8.3' /TITLE='Product-moment coefficient of correlation'. * Preparing data to export *. * 1) Standardized residuals *. COMPUTE d=Y-(a0+b*X). COMPUTE Xesti=X+(L*b*d)/(1+L*(b**2)). COMPUTE Yesti=Y-(d/(1+L*(b**2))). COMPUTE Sign=(Y-Yesti)/ABS(Y-Yesti). COMPUTE Ri=Sign&*SQRT((X-Xesti)&**2+L*(Y-Yesti)&**2). COMPUTE SDr=SQRT(CSSQ(Ri)/(n-2)). COMPUTE Residual=Ri/SDr. COMPUTE Mean=(Xesti+L*Yesti)/(1+L). COMPUTE vname={'Method1','Method2','Mean','Residual'}. COMPUTE Export={X,Y,Mean,Residual}. SAVE Export /OUTFILE=WorkingData /NAMES=vname. * 2) Regression line *. COMPUTE Param={a0,b}. SAVE Param /OUTFILE=Parameters. END MATRIX. DATASET ACTIVATE Parameters. PRESERVE. SET LOCALE=ENGLISH. STRING #var1 #var2 (A12). DO REPEAT A=#var1 #var2 /B=col1 col2. - COMPUTE A = STRING(B,F8.2). END REPEAT. !LET !a= !UNQUOTE(#var1). !LET !b= !UNQUOTE(#var2). * Write chart templates *. WRITE OUTFILE 'C:\Temp\Residual.sgt' /'' /'