## Code used to generate figures
import part2_code
part2_code.measurement1()
part2_code.measurement2()
import pandas as pd
import matplotlib.pyplot as plt
visit1 = pd.read_csv("assets/visit1_mricloud.csv")
visit2 = pd.read_csv("assets/visit2_mricloud.csv")
csf1 = visit1[(visit1['Type'] == 1) & (visit1['Level'] == 1)
& (visit1['Object'] == 'CSF')]['Volume']
csf2 = visit2[(visit2['Type'] == 1) & (visit2['Level'] == 1)
& (visit2['Object'] == 'CSF')]['Volume']
plt.scatter(csf1, csf2);
import statsmodels.api as sm
sm.graphics.mean_diff_plot(csf1, csf2)
plt.show()
import numpy as np
sm.graphics.mean_diff_plot(np.log(csf1), np.log(csf2))
plt.show()
## Calculating the ICC manually
sigmasq = np.var(np.log(csf1) - np.log(csf2))
sigmausq = np.var(0.5 * np.log(csf1) + 0.5 * np.log(csf2)) - sigmasq/2
print(100 * sigmausq / (sigmausq + sigmasq))
98.84502763511378
#### Fitting the random effect model
import pingouin as pg
import statsmodels.formula.api as smf
csfdf1 = visit1[(visit1['Type'] == 1) & (visit1['Level'] == 1)
& (visit1['Object'] == 'CSF')]
csfdf2 = visit2[(visit2['Type'] == 1) & (visit2['Level'] == 1)
& (visit2['Object'] == 'CSF')]
csfdf = pd.concat( [csfdf1, csfdf2] )
csfdf['logvolume'] = np.log(csfdf['Volume'])
md = smf.mixedlm("logvolume ~ 1", csfdf, groups=csfdf["ID"]).fit()
md.summary()
Model: | MixedLM | Dependent Variable: | logvolume |
No. Observations: | 38 | Method: | REML |
No. Groups: | 19 | Scale: | 0.0003 |
Min. group size: | 2 | Log-Likelihood: | 41.9000 |
Max. group size: | 2 | Converged: | Yes |
Mean group size: | 2.0 |
Coef. | Std.Err. | z | P>|z| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
Intercept | 11.345 | 0.055 | 207.545 | 0.000 | 11.237 | 11.452 |
Group Var | 0.057 | 1.491 |
Calculation of ICC in the same example using the mixedlm function.
Final answer will be copied here
Courtesy of Wang et al. (2021 Canadian Journal of Statistics)
Courtesy of Wang et al. (2021 Canadian Journal of Statistics)