9

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

    mod <- lmer(scale(Y)
                ~ X
                + (X | Z),
                data = df,
                REML = FALSE)

我用 来查看固定效应系数fixef(mod)

    > fixef(mod)
    (Intercept)      X1          X2         X3           X4 
     0.08577525 -0.16450047 -0.15040043 -0.25380073  0.02350007

从固定效应系数手动计算均值非常容易。但是,我希望它们没有缩放,我不确定如何准确地做到这一点。我知道缩放意味着从每个中减去平均值Y并除以标准偏差。但是,均值和标准差都是从原始数据中计算出来的。lmer()在使用原始数据的均值和标准差拟合模型后,我可以简单地反转这个过程吗?

谢谢你的帮助!


更新:我提出上述模型的方式似乎暗示因变量是通过对所有响应取平均值并除以所有响应的标准差来缩放的。通常,它以不同的方式完成。不是采用总体平均值和标准差,而是通过使用该对象的响应的平均值和标准差对每个对象的响应进行标准化。(lmer()我认为这很奇怪,因为随机截距应该解决这个问题......更不用说我们正在谈论按序数计算平均值的事实......)但是问题保持不变:一旦我拟合这样的模型,有没有一种干净的方法来重新调整拟合模型的系数?

4

1 回答 1

12

更新:泛化以允许缩放响应以及预测变量。

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

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

Y = b0 + b1*x1 + b2*x2 ... 

那么我们的缩放回归是

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

这相当于

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

所以bi = s0*bi'/si对于i>0

b0 = s0*b0'+mu0-sum(bi*mui)

实现这个:

 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
 }

试试线性模型:

m1 <- lm(Illiteracy~.,as.data.frame(state.x77))
b1 <- coef(m1)

制作数据的缩放版本:

ss <- scale(state.x77)

缩放系数:

m1S <- update(m1,data=as.data.frame(ss))
b1S <- coef(m1S)

现在尝试重新缩放:

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

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

  • 如果您仅缩放响应而不是预测变量,那么您应该提交(c(mean(response),rep(0,...))formc(sd(response),rep(1,...))for s(即,m并且s是变量被移动和缩放的值)。
  • 如果您仅缩放预测变量而不缩放响应,则提交c(0,mean(predictors))formc(1,sd(predictors))for s
于 2014-05-14T00:25:25.303 回答