Thank you, both.
Were these the models you had in mind?
library(nlme)
library(lme4)
library(emmeans)
library(ggplot2)
library(dplyr)
ββ 1. Data
url_raw β βhttps://github.com/jorgemmteixeira/nlmeU-datset/raw/main/data/armd0.rdaβ
load(url(url_raw))
Filter to post-baseline rows (baseline visual0 remains as a fixed covariate)
armd0_sub β armd0[armd0$time > 0, ]
armd0_sub$time_f_ord β factor(armd0_sub$time.f, ordered = TRUE)
armd0_sub$subject β as.factor(armd0_sub$subject)
Compute and plot empirical variogram
vgm_emp β Variogram(gls_ols, form = ~ time | subject)
plot(vgm_emp, main = βEmpirical Semi-variogram (Initial Check)β)
ββ 2. Model Fitting (No Random Slopes) βββββββββββββββββββββββββββββββββββββ
β nlme GLS (Marginal Models) β
gls_ar1 β gls(visual ~ visual0 + time * treat.f, data = armd0_sub,
correlation = corAR1(form = ~ tp | subject), method = βREMLβ)
gls_exp β gls(visual ~ visual0 + time * treat.f, data = armd0_sub,
correlation = corExp(form = ~ time | subject), method = βREMLβ)
gls_unstr β gls(visual ~ visual0 + time * treat.f, data = armd0_sub,
correlation = corSymm(form = ~ tp | subject),
weights = varIdent(form = ~ 1 | time.f), method = βREMLβ)
β lme4 LMM (Conditional Models - Random Intercept Only) β
lme_cs β lmer(visual ~ visual0 + time * treat.f + (1 | subject), data = armd0_sub)
lme_ar1 β lmer(visual ~ visual0 + time * treat.f + ar1(time_f_ord + 0 | subject), data = armd0_sub)
lme_diag β lmer(visual ~ visual0 + time * treat.f + diag(time.f + 0 | subject), data = armd0_sub)
β Markov Transition Model (OLS) β
armd_lag β armd0_sub
group_by(subject)
mutate(visual_prev = lag(visual))
filter(!is.na(visual_prev))
markov_ols β lm(visual ~ visual0 + visual_prev + time * treat.f, data = armd_lag)
ββ 3. Extract Estimates and Calculate CI Widths ββββββββββββββββββββββββββββ
extract_52 β function(mod, name) {
emm β emmeans(mod, pairwise ~ treat.f | time, at = list(time = 52))
res β as.data.frame(summary(emm$contrasts, infer = TRUE))
data.frame(Model = name, Estimate = res$estimate, Lower = res$lower.CL,
Upper = res$upper.CL, P_Value = res$p.value)
}
Combine all except Markov
results β rbind(
extract_52(gls_ar1, βGLS AR(1)β),
extract_52(gls_exp, βGLS Expβ),
extract_52(gls_unstr, βGLS Unstrβ),
extract_52(lme_cs, βLMM CSβ),
extract_52(lme_ar1, βLMM AR(1)β),
extract_52(lme_diag, βLMM Diagβ)
)
Add Markov Manually (Calculated at t=52)
m_summ β summary(markov_ols)$coefficients
m_est β m_summ[βtreat.fActiveβ,1] + m_summ[βtime:treat.fActiveβ,1] * 52
m_se β sqrt(vcov(markov_ols)[βtreat.fActiveβ,βtreat.fActiveβ] +
(52^2)vcov(markov_ols)[βtime:treat.fActiveβ,βtime:treat.fActiveβ])
results β rbind(results, data.frame(
Model = βMarkov OLSβ, Estimate = m_est, Lower = m_est - 1.96m_se,
Upper = m_est + 1.96*m_se, P_Value = 2 * (1 - pnorm(abs(m_est/m_se)))
))
ββ 4. Summary Table (Ordered by CI Width) ββββββββββββββββββββββββββββββββββ
final_table β results
mutate(CI_Width = Upper - Lower)
arrange(CI_Width)
select(Model, Estimate, Lower, Upper, CI_Width, P_Value)
print(final_table)