我在R
中使用lmer()
包中的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()
中是奇怪的,我认为随机拦截应该照顾到这一点......更不用说我们正在谈论按顺序计算方法的事实......)然而问题仍然存在相同:一旦我安装了这样的模型,是否有一种干净的方法来重新调整拟合模型的系数?
答案 0 :(得分:10)
已更新:已广义以允许缩放响应以及预测变量。
这是一个相当粗略的实施。
如果我们的原始(未缩放)回归是
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
和{/ p> 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,...))
提交m
,c(sd(response),rep(1,...))
提交s
(即m
s
是变量转换和缩放的值。c(0,mean(predictors))
提交m
,为c(1,sd(predictors))
提交s
。