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
留言
張貼留言