Calcular la desviación estándar (o la varianza de los coeficientes) básicamente significa que la fija estimaciones del efecto para cada nivel (de forma análoga a la BLUPs/condicional modos en un modelo mixto) de computación y su varianza. Usted puede hacer esto de manera apropiada la fijación de los contrastes a contr.sum
(suma-cero contrastes) (en este caso, usted todavía tiene que reconstruir el valor de un solo nivel, ya que el modelo sólo caben n-1
los coeficientes en un modelo con una intercepción), y/o el uso apropiado de la -1
o +0
en el modelo de ajuste de un no-interceptar modelo donde los coeficientes se calculan para cada nivel. O, como se muestra a continuación, usted puede utilizar la fuerza bruta a través de predict
(o, por ejemplo, a través de la lsmeans
paquete) para calcular los valores de cada nivel ...
Hacer de la seguridad de los datos con sólo dos niveles de la RE agrupación de variables:
dd <- expand.grid(f1=factor(1:3),f2=factor(1:2),rep=1:10)
library(lme4)
simList <-
suppressMessages(simulate(~f1+(1|f2),
newdata=dd,
family="gaussian",
newparams=list(theta=1,beta=c(0,1,2),sigma=1),
seed=101,n=500))
Ajuste f2
como efecto aleatorio y recuperar estimado de la varianza:
sumfun1 <- function(y0) {
m <- lmer(y~f1+(1|f2),data=transform(dd,y=y0))
unlist(VarCorr(m))
}
library(plyr)
r1 <- laply(simList,sumfun1,.progress="text")
Esto realmente funciona sorprendentemente bien, dado el escaso número de niveles:
mean(r1) ## 0.98
confint(lm(r1~1))
## 2.5 % 97.5 %
## (Intercept) 0.9248779 1.189029
Pero a menudo nos cero estimaciones de la varianza:
sum(r1==0) ## 60
(y un puñado de valores muy pequeños)
sum(log10(r1)<(-6)) ## 69
Ahora intenta a través de efectos fijos:
sumfun2 <- function(y0) {
lm1 <- lm(y~f1+f2,data=transform(dd,y=y0))
pframe <- data.frame(f1="1",f2=levels(dd$f2))
var(predict(lm1,newdata=pframe))
}
r2 <- laply(simList,sumfun2,.progress="text")
mean(r2) ## 1.01294
confint(lm(r2~1))
## 2.5 % 97.5 %
## (Intercept) 0.89081 1.135071
r1[log10(r1)< (-6)] <- 1e-6
p0 <- rbind(data.frame(m="f1=random",r=r1),
data.frame(m="f1=fixed",r=r2))
library(ggplot2); theme_set(theme_bw())
ggplot(p0,aes(x=log10(r),fill=m))+
geom_histogram(alpha=0.5,position="identity")+
geom_vline(xintercept=0,lty=2)
La fija-efecto de enfoque funciona mejor de lo que esperaba ...