I am having a problem with correctly graphing output of an interrupted time series conducted using -melogit- with random intercept, and I would greatly appreciate some guidance. I’ve tried what feels like hundreds of configurations, and yet I just can't quite get it right.
This analysis is run on Stata v 15.1 in Windows 10 and is an evaluation of the association between a reimbursement change and utilization. Patients are clustered by hospital. There is a 4 month lead-in period before the payment change, during which patients were excluded.
Problems: When I try to plot both fixed and posterior means for the random effects (which is what I actually want to show), the pre-period lines for my predicted and counterfactual estimates do not overlap AND the y-intercept of the plots fall well outside the range of the unadjusted data.
Note that when I plot only fixed effects--as a benchmark for troubleshooting the graph, but not as my main desired output--my counterfactual and predicted plots in the pre-period lie on top of one another, as I would expect, but the plot still falls well below the unadjusted data.
My questions are:
1. What is Stata actually doing with this code?
2. What (and how) should I be asking it to plot the predicted values and counterfactuals correctly?
3. Is there a data characteristic (rather than operator naivete), that would explain why data would behave this way?
Details:
Elapsed_month is the time variable, 0 to 40, and represents the slope of the pre-period
Policy is the intervention, 0 or 1, and represents the level shift at the time the intervention was implemented
Policy#elapsed_month represents the change in the slope between the pre-period and the post period
Cohort4num is the binary dependent variable representing utilization of the treatment as 0,1
See code and resulting graphic below.
The -melogit- model and excerpt of the output:
[CODE]
melogit cohort4num c.elapsed_month i.policy c.elapsed_month#i.policy cr_onsite `patient'
`hospital' `market' `season', || new_hosp_num:, vce(robust)
[CODE]
Array
Below is one way I've tried to graph the index functions:
Code:
********************************************************************************
***USING AVERAGES OF ALL COVARIATES***
*saves original covariate values, calculates mean, an puts that in the covariate field for each x
foreach x of varlist cr_onsite `patient' `hospital' `market' `season' {
gen `x'_save=`x'
egen `x'_mean=mean(`x')
replace `x'=`x'_mean
}
predict average_pred7, mu
*******************************************************************************
**ESTIMATE RANDOM EFFECTS MEANS FOR COVARIATE MEANS
predict r7e, reffects
egen r7e_mean=mean(r7e)
summ r7e
***save so you can use the actual variable later ****/
gen elapsed_month_save=elapsed_month
*******************************************************************************
****ESTIMATE INDEX FUNCTIONS WITHOUT POSTERIOR MEANS RANDOM EFFECTS
forval t=0/40 {
replace elapsed_month = `t'
predict xb7_`t', xb
}
gen mu7_xb =1 / (1+exp(-1*(xb7_1))) if elapsed_month_save == 0
****mu7_xb is the predicted probability at the mean of covariates at time=0
****However, we need to compute at each value of time:
forval t=0/40 {
replace mu7_xb =1 /(1+exp(-1*(xb7_`t'))) if elapsed_month_save==`t'
}
*Here mu7_xb is the predicted probability for each time period based on x_mean*b^hat.
********************************************************************************
***TO INCLUDE RANDOM EFFECTS MEANS
***Recalculate mu7_xb with the re:
gen mu7_xb_re=1 /(1+exp(-1*(xb7_1+ r7e_mean))) if elapsed_month_save==0
**** mu7_xb _re is the predicted probability at the mean of covariates and mean of random effects at time=0
****Recompute at each value of time:
forvalues t=0/40{
replace mu7_xb_re =1 /(1+exp(-1*(xb7_`t'+ r7e_mean ))) if elapsed_month_save==`t'
}Next, is the same approach used to predict the counterfactual:
Code:
***********************
****COUNTERFACTUAL*****
*reset elapsed_month back to original
foreach x in elapsed_month {
replace `x'=`x'_save
drop elapsed_month_save
}
********************************************************************************
*calculate counterfactual without effect of policy or policyXtime
foreach x in policy elapsed_month {
gen `x'_save=`x'
replace `x'=0
}
predict average_pred8, mu
*******************************************************************************
** PREDICT RANDOM EFFECTS MEANS [FOR COUNTERFACTUAL]
predict r8e, reffects
egen r8e_mean=mean(r8e)
*********************************************************************************
****PREDICT INDEX FUNCTIONS WITHOUT POSTERIOR MEANS RANDOM EFFECTS
forval t=0/40 {
replace elapsed_month = `t'
predict xb8_`t', xb
}
***The above is the index function without the random effects.
gen mu8_xb =1 / (1+exp(-1*(xb8_1))) if elapsed_month_save==0
****mu8 is the predicted probability [OF THE COUNTERFACTUAL] at the mean of covariates at time=0
****However, you need to compute at each value of time:
forval t=0/40 {
replace mu8_xb =1 /(1+exp(-1*(xb8_`t'))) if elapsed_month_save==`t'
}
*Here mu8_xb is the predicted probability [FOR THE COUNTERFACTUAL] for each time period based on x_mean*b^hat.
*******************************************************************************
***TO INCLUDE RANDOM EFFECTS MEANS [FOR THE COUNTERFACTUAL]
***Recalculate mu8_xb with the re:
gen mu8_xb_re=1 /(1+exp(-1*(xb8_1+ r8e_mean))) if elapsed_month_save==0
**** mu8_xb _re is the predicted probability [OF THE COUNTERFACTUAL] at the mean of covariates and mean of random effects at time=0
****Recompute at each value of time:
forvalues t=0/40{
replace mu8_xb_re =1 /(1+exp(-1*(xb8_`t'+ r8e_mean ))) if elapsed_month_save==`t'
}Array
Thank you for any advice you can provide!!
0 Response to Problem with graphing interrupted time series with random intercept -melogit-
Post a Comment