Stata Code for Chapter One: evaluate_disorganized.do

 trueparam_disorganized, delta(0.5) canna01(0) predorig(3) h(1) numpat(1000) reseed(24)

display "canna01: "$canna01

display "Prediction origin: t="$PredOrig

display "Prediction horizon: h="$h

display "delta= " $delta

display "Median of relative biases: " r(MedianRelBias)

display "Minimum of relative biases: " r(MinRelBias)

display "Maximum of relative biases: " r(MaxRelBias)

display "Median of correlations between predicted and true transformed benefits: " r(MedianCorr) display "Minimum of correlations: " r(MinCorr)

display "Maximum of correlations: " r(MaxCorr)

trueparam_disorganized.ado.

(Stata ado program that performs the Monte Carlo simulations. This program is called by evaluate_disorganized.do)

program trueparam_disorganized, rclass

version 15.1

syntax, delta(numlist max=1 >=0) canna01(numlist integer >=0 <=1) predorig(integer) h(integer) ///

[numpat(integer 1000) reseed(integer -1 )]

clear

*Seed for simulating random effects with drawnorm command if `reseed'<0 {

global reseed " "


}

else {

global reseed "seed(`reseed')"

}

******************

global canna01=`canna01' // enter 1 if patient used cannabis

*******************

global PredOrig=`predorig' //PredOrig is the prediction origin (a time point).

global h=`h' //h=horizon; enter a negative number or 0 for retrospective measurement of benefits; **********************

global NumPat=`numpat' //Enter number of simulated patients

*******************

global delta=`delta' // Enter distance from a true parameter to parameter estimate in Table 1 in standard error units

**********************

* 64 is the total number of possible combinations of true parameter values for a fixed value of delta.

* There are 6 model parameters and, therefore, 2^ 6 = 64

set matsize 64

if $NumPat>64 {

if $NumPat<=11000 set matsize $NumPat

else {

display as error "Number of simulated patients cannot be higher than 11000"

exit, clear

}

}

TrueParam_Module1_disorganized


TrueParam_Module2_disorganized

clear

quietly svmat Results, names(col) // convert the matrix into a data set

save "Results_delta${delta}_canna01${canna01}_PredOrig${PredOrig}_h${h}_NumPat${NumPat}.dta", replace

quietly summarize MeanBias,detail

return scalar MedianMeanBias=r(p50)

return scalar MinMeanBias=r(min)

return scalar MaxMeanBias=r(max)

quietly summarize SDBias, detail

return scalar MedianSDBias=r(p50)

return scalar MinSDBias=r(min)

return scalar MaxSDBias=r(max)

quietly summarize RelBias, detail

return scalar MedianRelBias=r(p50)

return scalar MinRelBias=r(min)

return scalar MaxRelBias=r(max)

quietly summarize Correlation, detail

return scalar MedianCorr=r(p50)

return scalar MinCorr=r(min)

return scalar MaxCorr=r(max)

quietly summarize MeanTrueBenef, detail

return scalar MedianMeanTrueBenef=r(p50)

return scalar MinMeanTrueBenef=r(min)

return scalar MaxMeanTrueBenef=r(max)


********************

end

TrueParam_Module1_disorganized.ado.

(Stata ado program used by trueparam_disorganized.) set more off

set matsize 11000

*This reads the estimates of the model reported in Table 1 of paper estimates use "Fitted_model"

*This gets the variance covariance matrix of estimates

matrix VCe=e(V) ********************************************

*Vector of estimated fixed effects from Model in Table 1 is created global b1=_b[dis_lt4:_cons]

global b2=_b[dis_lt4:canna01]

global b3=_b[dis_lt4:pt1]

global b4=_b[dis_lt4:pt2]

global b5=_b[dis_lt4:pt3]

matrix bGLS=($b1 \ ///

$b2 \ /// $b3 \ ///

$b4 \ ///

$b5)

*The variance-covariance matrix D of random effects from model in Table 1 is created global D11=_b[/var(_cons[id])]

matrix D=$D11

end


TrueParam_Module2_disorganized.ado.

(Stata ado program used by trueparam_disorganized.) if $delta!=0 {

matrix Results=J(64,5,0) //2^6=64 local deltalist -$delta $delta

}

else {

matrix Results=J(1,5,0) local deltalist 0

}

***********************

matrix colnames Results = MeanBias SDBias RelBias Correlation MeanTrueBenef local RowOfResults=1

foreach delta1 of numlist `deltalist' {

foreach delta2 of numlist `deltalist' {

foreach delta3 of numlist `deltalist' {

foreach delta4 of numlist `deltalist' {

foreach delta5 of numlist `deltalist' {

foreach delta6 of numlist `deltalist' {

*True fixed effects are computed

global b1True=$b1 + `delta1'*sqrt(VCe[5,5])

global b2True=$b2 + `delta2'*sqrt(VCe[1,1])

global b3True=$b3 + `delta3'*sqrt(VCe[2,2])

global b4True=$b4 + `delta4'*sqrt(VCe[3,3])

global b5True=$b5 + `delta5'*sqrt(VCe[4,4])

matrix bTrue=($b1True \ ///


$b2True \ /// $b3True \ /// $b4True \ /// $b5True)

matrix list bTrue

*True variance covariance matrix is computed

global D11True=$D11+`delta6'*sqrt(VCe[6,6])

matrix DTrue=$D11True

*****************************************

display "Simulation `RowOfResults' for canna01=$canna01, Delta=$delta, Prediction Origin=$PredOrig, Horizon=$h"

clear

TrueParam_Module3_disorganized

matrix Results[`RowOfResults',1]=$MeanBias

matrix Results[`RowOfResults',2]=$SDBias

matrix Results[`RowOfResults',3]=$RelBias

matrix Results[`RowOfResults',4]=$Correlation

matrix Results[`RowOfResults',5]=$MeanTrueBenef

local RowOfResults=`RowOfResults'+1

}

}

}

}

}

}

End

/* variance of intercept */


TrueParam_Module3_disorganized.ado.

(Stata ado program used by trueparam_disorganized.) *Design matrix Z for random effects

matrix A=J(7, 1, 1)

matrix pt1=J(7, 1, 0)

forvalues i=1/7{

matrix pt1[`i', 1]=P[1,1]*(`i'-1) + P[1,2]*(`i'-1)^2 + P[1,3]*(`i'-1)^3 + P[1,4]

}

matrix Z=A

matrix colnames Z=Intercept ********************************************** *Design matrix X for fixed effects

matrix A=J(7, 1, 1)

matrix B=J(7, 1, $canna01)

matrix pt2=J(7, 1, 0)

forvalues i=1/7{

matrix pt2[`i', 1]=P[2,1]*(`i'-1) + P[2,2]*(`i'-1)^2 + P[2,3]*(`i'-1)^3 + P[2,4] }

matrix pt3=J(7, 1, 0) forvalues i=1/7{

matrix pt3[`i', 1]=P[3,1]*(`i'-1) + P[3,2]*(`i'-1)^2 + P[3,3]*(`i'-1)^3 + P[3,4] }

matrix X=A,B,pt1,pt2,pt3

matrix colnames X=Intercept canna01 ptime1 ptime2 ptime3 **********************************************


if $PredOrig==0|$PredOrig==1|$PredOrig==2|$PredOrig==3|$PredOrig==4|$PredOrig==5 |$PredOrig==6 {

if $PredOrig==0 { matrix Z=Z[1..1,1...] // matrix X=X[1..1,1...]

}

if $PredOrig==1{ matrix Z=Z[1..2,1...] matrix X=X[1..2,1...] }

if $PredOrig==2{ matrix Z=Z[1..3,1...] matrix X=X[1..3,1...] }

if $PredOrig==3{ matrix Z=Z[1..4,1...] matrix X=X[1..4,1...] }

if $PredOrig==4{ matrix Z=Z[1..5,1...] matrix X=X[1..5,1...]

}

if $PredOrig==5{

matrix Z=Z[1..6,1...] matrix X=X[1..6,1...]


}

if $PredOrig==6{ matrix Z=Z[1..7,1...] matrix X=X[1..7,1...] }

}

else{

display as error "Values for predOrig should be 0,1,2,3,4,5,or 6"

exit, clear

}

*********************************************

if !(1<=$PredOrig+$h & $PredOrig+$h<=6) {

display as error "predorig+h should be in the interval [1,6]"

exit, clear

}

********************************************

*First we simulate the patients

*The simulated random intercept LambdaR has mean zero

clear

quietly drawnorm LambdaR, n($NumPat) cov(DTrue) $reseed // DTrue was created in Module2 mkmat LambdaR, matrix(RanEff) // Each row of matrix RanEff corresponds to a set of random effects (for intercept and ptime1) for one simulated patient

*Columns of matrix MatbTrue will contain the true fixed effects repeatedly

matrix MatbTrue=bTrue

forvalues i=2/$NumPat {


matrix MatbTrue=MatbTrue,bTrue

// each column has a vector of bTrue

}

*Calculate linear predictor

matrix RanEfft=RanEff'

matrix ZR=Z*RanEfft

matrix XB=X*MatbTrue

matrix ata=ZR+XB

*For each element of anta, calculate p. This will be the predicted P, which can be used to calculate the predicted benefit as well as to simulate y.

matrix p=J(rowsof(ata), colsof(ata), 0) // number of time points by number of patients

matrix y=J(rowsof(ata), colsof(ata), 0)

/* begin loop */

local i=1 // i for time

while `i'<=rowsof(ata){

local j=1 // j for patients while `j'<=colsof(ata){

matrix p[`i',`j']=exp(ata[`i',`j'])/(1+exp(ata[`i',`j']))

matrix y[`i',`j']=rbinomial(1, p[`i',`j'])

local j = `j' + 1 }

local i = `i' + 1 }

/* end loop */

*Create dataset xy with y and Xs for 1000 patients in rows by appending matrices. Include patient id


matrix X1=X

forvalues i=2/$NumPat {

matrix X1=X1\X }

matrix y1=y[1..., 1] forvalues j=2/$NumPat {

matrix y2=y[1..., `j']

matrix y1=y1\y2 }

matrix id=J(rowsof(ata), 1, 1) forvalues j=2/$NumPat {

matrix id2=J(rowsof(ata), 1, `j')

matrix id=id\id2 }

matrix xy=y1, X1, id

matrix colnames xy=dis_lt4 Intercept canna01 pt1 pt2 pt3 id

// convert to dataset

clear

svmat xy, names(col)

predict PrRanEff* , reffects

duplicates drop id, force

keep PrRanEff* id

svmat RanEff, names(col)

spearman PrRanEff1 LambdaR ******************************************************************************** *Compute predicted benefit and true benefit for each patient


quietly generate ppred2=1/(1+ exp(-($b1 + PrRanEff1 + $b2*$canna01 + $b3 * pt1[$PredOrig+$h+1, 1] + /// $b4 * pt2[$PredOrig+$h+1, 1] + $b5 * pt3[$PredOrig+$h+1, 1] ))) quietly generate ppred1=1/(1+ exp(-($b1 + PrRanEff1 + $b2*$canna01 + $b3* pt1[1, 1] + ///

$b4 * pt2[1, 1] + $b5 * pt3[1, 1] )))

quietly generate PredBenef=ppred2-ppred1

quietly generate ptrue2=1/(1+ exp(-($b1True + LambdaR + $b2True*$canna01 + $b3True * pt1[$PredOrig+$h+1, 1] + ///

$b4True * pt2[$PredOrig+$h+1, 1] + $b5True *

pt3[$PredOrig+$h+1, 1] )))

quietly generate ptrue1=1/(1+ exp(-($b1True + LambdaR + $b2True*$canna01 + $b3True * pt1[1, 1]+ ///

$b4True * pt2[1, 1] + $b5True * pt3[1, 1] )))

quietly generate TrueBenef=ptrue2-ptrue1

keep PredBenef TrueBenef ******************************************************************************** *Individual bias is computed

quietly generate double Bias=PredBenef-TrueBenef

*Individual relative bias is computed

quietly summarize Bias, detail

global MeanBias=r(mean) //Mean bias

global SDBias=sqrt(r(Var)) // SD of bias

quietly summarize TrueBenef, detail

global MeanTrueBenef=r(mean)

global RelBias=($MeanBias/$MeanTrueBenef)*100 // Relative bias ******************************************************************************** *Computation of correlation between predicted and true benefit


quietly spearman TrueBenef PredBenef global Correlation=r(rho)

end

留言

這個網誌中的熱門文章

可轉移性、普遍性、代表性和外部有效性

頻率學派 vs 貝氏學派

貝氏分析計算器