如何从带有缩放响应的lmer()模型中去除系数

lor*_*age 7 r mean lme4 lmer

我从包中装了一个R带有lmer()-function 的模型lme4.我缩放了因变量:

    mod <- lmer(scale(Y)
                ~ X
                + (X | Z),
                data = df,
                REML = FALSE)
Run Code Online (Sandbox Code Playgroud)

我看一下固定效应系数fixef(mod):

    > fixef(mod)
    (Intercept)      X1          X2         X3           X4 
     0.08577525 -0.16450047 -0.15040043 -0.25380073  0.02350007
Run Code Online (Sandbox Code Playgroud)

从固定效应系数手动计算平均值非常容易.但是,我希望它们不被缩放,我不确定如何完全这样做.我知道缩放意味着减去每个平均值Y并且偏离标准偏差.但是,平均值和标准偏差都是从原始数据计算出来的.在lmer()使用原始数据的均值和标准偏差拟合-model 后,我可以简单地反转此过程吗?

谢谢你的帮助!


更新:我提出上述模型的方式似乎意味着通过取所有响应的均值并除以所有响应的标准差来缩放因变量.通常,它的完成方式不同.不是采用总体平均值和标准偏差,而是通过使用该受试者的反应的平均值和标准偏差来对每个受试者标准化响应.(这是奇怪的,lmer()我认为随机拦截应该照顾...更不用说我们正在谈论按顺序计算方法的事实......)然而问题保持不变:一旦我适合这样一个模型,是否有一种干净的方法来重新调整拟合模型的系数?

Ben*_*ker 11

更新:通用化以允许缩放响应以及预测变量.

这是一个相当粗略的实现.

如果我们的原始(未缩放)回归是

Y = b0 + b1*x1 + b2*x2 ... 
Run Code Online (Sandbox Code Playgroud)

然后我们的缩放回归是

(Y0-mu0)/s0 = b0' + (b1'*(1/s1*(x1-mu1))) + b2'*(1/s2*(x2-mu2))+ ...
Run Code Online (Sandbox Code Playgroud)

这相当于

Y0 = mu0 + s0((b0'-b1'/s1*mu1-b2'/s2*mu2 + ...) + b1'/s1*x1 + b2'/s2*x2 + ...)
Run Code Online (Sandbox Code Playgroud)

所以bi = s0*bi'/sii>0

b0 = s0*b0'+mu0-sum(bi*mui)
Run Code Online (Sandbox Code Playgroud)

实现这个:

 rescale.coefs <- function(beta,mu,sigma) {
    beta2 <- beta ## inherit names etc.
    beta2[-1] <- sigma[1]*beta[-1]/sigma[-1]
    beta2[1]  <- sigma[1]*beta[1]+mu[1]-sum(beta2[-1]*mu[-1])
    beta2
 }
Run Code Online (Sandbox Code Playgroud)

尝试使用线性模型:

m1 <- lm(Illiteracy~.,as.data.frame(state.x77))
b1 <- coef(m1)
Run Code Online (Sandbox Code Playgroud)

制作数据的缩放版本:

ss <- scale(state.x77)
Run Code Online (Sandbox Code Playgroud)

比例系数:

m1S <- update(m1,data=as.data.frame(ss))
b1S <- coef(m1S)
Run Code Online (Sandbox Code Playgroud)

现在尝试重新缩放:

icol <- which(colnames(state.x77)=="Illiteracy")
p.order <- c(icol,(1:ncol(state.x77))[-icol])
m <- colMeans(state.x77)[p.order]
s <- apply(state.x77,2,sd)[p.order]
all.equal(b1,rescale.coefs(b1S,m,s))  ## TRUE
Run Code Online (Sandbox Code Playgroud)

这假设响应和预测变量都是按比例缩放的.

  • 如果只缩放响应而不缩放预测变量,那么您应该提交(c(mean(response),rep(0,...))for mc(sd(response),rep(1,...))for s(即,m并且s是变量被移位和缩放的值).
  • 如果只缩放预测变量而不缩放响应,则提交c(0,mean(predictors))for mc(1,sd(predictors))for s.