Hi all,
I am trying to compute power calculations for an RCT with two treatment arms (with effect1 for treatment1 and effect2 for treatment2) and three respondent types (1=never complied in baseline, 2=always complied in baseline, 3=new to program), using Monte-Carlo simulations. I vary the effect size of my two treatments and expect a +5% take-up rate for T1 and +10% for T2 for never complied respondents (so 5% and 10% take-up rate), a +5% take-up rate for T1 and +10% for T2 for respondents new to the program (assumed a 20% take-up in the control group, which is the average pop take-up, so 25% for T1 and 30% for T2), and take-up rate remains perfect for type 2 (always complied, will be used to test another outcome variable)
At some point, when running the simulation, I get the following error message: ".dta file is corrupt - Pieces in the file are not where they are expected to be. r(688);" and I'm not sure what it could be. When running the simulations with less iterations and without varying the effect size, the dofile works perfectly.
Any help would be much appreciated.
Thanks
I am trying to compute power calculations for an RCT with two treatment arms (with effect1 for treatment1 and effect2 for treatment2) and three respondent types (1=never complied in baseline, 2=always complied in baseline, 3=new to program), using Monte-Carlo simulations. I vary the effect size of my two treatments and expect a +5% take-up rate for T1 and +10% for T2 for never complied respondents (so 5% and 10% take-up rate), a +5% take-up rate for T1 and +10% for T2 for respondents new to the program (assumed a 20% take-up in the control group, which is the average pop take-up, so 25% for T1 and 30% for T2), and take-up rate remains perfect for type 2 (always complied, will be used to test another outcome variable)
At some point, when running the simulation, I get the following error message: ".dta file is corrupt - Pieces in the file are not where they are expected to be. r(688);" and I'm not sure what it could be. When running the simulations with less iterations and without varying the effect size, the dofile works perfectly.
Any help would be much appreciated.
Thanks
Code:
**************************************************************************************** ********************************* Power calculation: ********************************* ******************************* Monte-Carlo simualation****************************** **************************************************************************************** clear cd "$rawdata/Simulation" capture log close _all log using "$logfiles/power_by_simulation_regress", replace *Create a temporary file that will store the results of the simulations tempname reg_sim_name tempfile reg_sim_results postfile `reg_sim_name' sample_size iter effect1 effect2 reject_t1 reject_t2 /// comformite1_1 conformite1_2 conformite1_3 /// conformite3_1 conformite3_2 conformite3_3 /// using `reg_sim_results' set seed 20230120 ****************************************************************************************** ************* 1. SPECIFY design factors and the number of simulations ******************** ****************************************************************************************** clear local control = 0.2 local power = 0.8 local alpha = 0.05 local side "two" local sims=1000 // Number of simulations local n_cipe = 12 // Number of departments local n_type = 3 // Number of respondents type local n_zones = 9 // Number of zones per departments local n_treatment = 3 // Number of treatments (C, T1 et T2) local groupe = `n_cipe'*`n_type'*`n_zones' // Number of groups local min = 1500 // Min sample size local max = 3500 // Max sample size #delimit ; local min_rep = cond(((`min'-mod(`min', `groupe'))/`groupe') * `groupe'>=`min', ((`min'-mod(`min', `groupe'))/`groupe') * `groupe', ((`min'-mod(`min', `groupe'))/`groupe'+1) * `groupe') // Min number of respondents in loop ; #delimit cr #delimit ; local max_rep = cond(((`max'-mod(`max', `groupe'))/`groupe') * `groupe'<=`max', ((`max'-mod(`max', `groupe'))/`groupe') * `groupe', ((`max'-mod(`max', `groupe'))/`groupe'-1) * `groupe') // Max number of respondents in loop ; #delimit cr local control = 0.2 // Take-up in group control forvalues sample_size=`min_rep'(`groupe')`max_rep' { forvalues effect1=0.06(0.01)0.1 { // Varying effect in T1 forvalues effect2=0(0.01)0.05 { // Varying effect in T2 local effect2 = `effect1' + `effect2' local effect1a = `control' + `effect1' // Expected take up rate for new to program, T1 local effect2a = `control' + `effect2' // Expected take up rate for new to program, T2 display "effect1=`effect1'" display "effect1a=`effect1a'" display "effect2=`effect2'" display "effect2a=`effect2a'" display "sample_size=`sample_size'" *Generate fake data with specified distribution and effect, regress outcome on treatment and record if significant local it = 1 // Number of iteration while `it' <=`sims'{ display "iteration=`it'" clear qui set obs `n_type' // One respondent by type by zone qui gen type = _n // Respondent type qui expand `n_zones' qui sort type qui bysort type: gen village = _n qui bysort type: gen traitement = /// (village-1-mod(village-1, `n_treatment'))/`n_treatment' + 1 // Treatment local expand = /// (`sample_size'-mod(`sample_size', `groupe'))/`groupe' * `n_cipe' qui expand `expand' local group = (`sample_size'-mod(`sample_size', `groupe'))/`groupe' qui bysort village type: gen order=_n qui gen departement = (order-1-mod(order-1, `group'))/`group' +1 qui egen village2 = group(departement village) qui drop village order qui rename village2 village * Binary outcome variable - take-up (Yes/No) qui gen conformite0 = cond(type==2, 1, 0) // Baseline: type==2 - always take-up, 0 otherwise #delimit ; qui gen conformite1 = /// cond(type==2, conformite0, cond(type==1 & traitement==1, conformite0, cond(type==3 & traitement==1, rbinomial(1, `control'), cond(type==1 & traitement==2, rbinomial(1, `effect1'), cond(type==3 & traitement==2, rbinomial(1, `effect1a'), cond(type==1 & traitement==3, rbinomial(1, `effect2'), cond(type==3 & traitement==3, rbinomial(1, `effect2a'),.))))))); #delimit cr * Check if outcome does not vary (i.e. all zeroes or all ones generated) local sample=`sample_size'/`n_treatment' local tot_same0 = 0 local tot_same1 = 0 forvalues t=1/`n_treatment' { quietly count if conformite1==0 & type == 1 & traitement==`t' local tot_same0 = `tot_same0' + `r(N)' quietly count if conformite1==1 & type == 1 & traitement==`t' local tot_same1 = `tot_same1' + `r(N)' } if `tot_same0' == `sample' | `tot_same1' == `sample' { * No variations local reject_t1 = 0 local reject_t2 = 0 } else { qui regress conformite1 i.traitement i.departement i.village if type==1 // Simple regression /*if n_treatment==2 { local t_value = _b[2.traitement]/_se[2.traitement] // the t-value for the t-test local df=2*((`sample_size'/2)-1) // degrees of freedom is a function of the sample size } */ if `n_treatment'==3 { local t_value1 = _b[2.traitement]/_se[2.traitement] // the t-value for the t-test local t_value2 = _b[3.traitement]/_se[3.traitement] // the t-value for the t-test local df=2*((`sample_size'/2)-1) // degrees of freedom is a function of the sample size } if "`side'" == "two" { local critical_l = invt(`df', `alpha'/2) //the lower critical value local critical_u = invt(`df', 1-`alpha'/2) //the upper critical value local reject_t1=(`t_value1'>`critical_u')|(`t_value1'<`critical_l') //reject if the t-value lies in the critical level, =1 if null rejected, 0 if not local reject_t2=(`t_value2'>`critical_u')|(`t_value2'<`critical_l') } } forvalues type=1(2)3 { // For each type forvalues trait=1/3 { // For each treatment qui sum conformite1 if type==`type' & traitement==`trait' local comformite`type'_`trait' = `r(mean)' } } post `reg_sim_name' (`sample_size') (`it') (`effect1') (`effect2') /// (`reject_t1') (`reject_t2') /// (`comformite1_1') (`comformite1_2') (`comformite1_3') /// (`comformite3_1') (`comformite3_2') (`comformite3_3') //write output from simulation to the temporary file qui tempfile reg_simulated_data_`it'_`sample_size' //save the data from the iterations qui save `reg_simulated_data_`it'_`sample_size'', replace local it = `it' +1 } } } } ***************************************************************************************** ******************** 3. Load results of simulation and estimate power ******************* ***************************************************************************************** postclose `reg_sim_name' use `reg_sim_results',clear save "$rawdata/Simulation/simulated_data_regress", replace
Comment