Répondant à votre question "Je me demande comment sortir l'ATE du modèle 2" dans les commentaires:
Tout d'abord, dans votre modèle 2, tous les sont pas identifiables, ce qui pose le problème du manque de rang dans la matrice de conception. Il est nécessaire de supprimer un niveau, par exemple en supposant que pour . Autrement dit, en utilisant le codage de contraste et en supposant que l'effet du traitement à la période 1 est 0. Dans R, il codera le terme d'interaction avec l'effet du traitement à la période 1 comme niveau de référence, et c'est également la raison pour laquelle a l'interprétation de l'effet du traitement à la période 1. Dans SAS, il codera l'effet du traitement à la période comme niveau de référence, puis a l'interprétation de l'effet du traitement à la périodeγ j = 0 j = 1 ˜ β m ˜ β mγjγj=0j=1β~mβ~m, plus la période 1.
En supposant que le contraste est créé de la manière R, les coefficients estimés pour chaque terme d'interaction (je désignerai toujours ceci par , bien que ce ne soit pas précisément ce que vous avez défini dans votre modèle) ont l'interprétation de la différence d'effet de traitement entre les périodes et période 1. Noter ATE à chaque période , puis pour . Par conséquent, un estimateur pourγjjATEjγj=ATEj−ATE1j=2,…,mATEjβ~+γjATE=β=1m∑mj=1ATEj=β~+(β~+γ2)+⋯+(β~+γm)m=β~+1m(γ2+⋯+γm)
J'ai fait une simulation simple en R pour vérifier cela:
set.seed(1234)
time <- 4
n <-2000
trt.period <- c(2,3,4,5) #ATE=3.5
kj <- c(1,2,3,4)
intercept <- rep(rnorm(n, 1, 1), each=time)
eij <- rnorm(n*time, 0, 1.5)
trt <- rep(c(rep(0,n/2),rep(1,n/2)), each=time)
y <- intercept + trt*(rep(trt.period, n))+rep(kj,n)+eij
sim.data <- data.frame(id=rep(1:n, each=time), period=factor(rep(1:time, n)), y=y, trt=factor(trt))
library(lme4)
fit.model1 <- lmer(y~trt+(1|id), data=sim.data)
beta <- getME(fit.model1, "fixef")["trt1"]
fit.model2 <- lmer(y~trt*period + (1|id), data=sim.data)
beta_t <- getME(fit.model2, "fixef")["trt1"]
gamma_j <- getME(fit.model2, "fixef")[c("trt1:period2","trt1:period3","trt1:period4")]
results <-c(beta, beta_t+sum(gamma_j)/time)
names(results)<-c("ATE.m1", "ATE.m2")
print(results)
Et les résultats le vérifient:
ATE.m1 ATE.m2
3.549213 3.549213
Je ne sais pas comment changer directement le codage de contraste dans le modèle 2 ci-dessus, donc pour illustrer comment on peut directement utiliser une fonction linéaire des termes d'interaction, ainsi que comment obtenir l'erreur standard, j'ai utilisé le package multcomp:
sim.data$tp <- interaction(sim.data$trt, sim.data$period)
fit.model3 <- lmer(y~tp+ (1|id), data=sim.data)
library(multcomp)
# w= tp.1.1 + (tp.2.1-tp.2.0)+(tp.3.1-tp.3.0)+(tp.4.1-tp.4.0)
# tp.x.y=interaction effect of period x and treatment y
w <- matrix(c(0, 1,-1,1,-1,1,-1,1)/time,nrow=1)
names(w)<- names(getME(fit.model3,"fixef"))
xx <- glht(fit.model3, linfct=w)
summary(xx)
Et voici la sortie:
Simultaneous Tests for General Linear Hypotheses
Fit: lmer(formula = y ~ tp + (1 | id), data = sim.data)
Linear Hypotheses:
Estimate Std. Error z value Pr(>|z|)
1 == 0 3.54921 0.05589 63.51 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Adjusted p values reported -- single-step method)
wV^wT−−−−−√wV
Codage des écarts
β~ATEATEj−ATE
sim.data$p2vsmean <- 0
sim.data$p3vsmean <- 0
sim.data$p4vsmean <- 0
sim.data$p2vsmean[sim.data$period==2 & sim.data$trt==1] <- 1
sim.data$p3vsmean[sim.data$period==3 & sim.data$trt==1] <- 1
sim.data$p4vsmean[sim.data$period==4 & sim.data$trt==1] <- 1
sim.data$p2vsmean[sim.data$period==1 & sim.data$trt==1] <- -1
sim.data$p3vsmean[sim.data$period==1 & sim.data$trt==1] <- -1
sim.data$p4vsmean[sim.data$period==1 & sim.data$trt==1] <- -1
fit.model4 <- lmer(y~trt+p2vsmean+p3vsmean+p4vsmean+ (1|id), data=sim.data)
Production:
Fixed effects:
Estimate Std. Error t value
(Intercept) 3.48308 0.03952 88.14
trt1 3.54921 0.05589 63.51
p2vsmean -1.14774 0.04720 -24.32
p3vsmean 1.11729 0.04720 23.67
p4vsmean 3.01025 0.04720 63.77