gpt4 book ai didi

r - 如何从带有缩放响应的 lmer() 模型中取消缩放系数

转载 作者:行者123 更新时间:2023-12-04 10:51:13 25 4
gpt4 key购买 nike

我在 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() 中很奇怪,我认为随机截距应该解决这个问题......更不用说我们正在谈论按序数计算均值的事实......)但是问题保持不变:一旦我拟合了这样的模型,是否有一种干净的方法来重新调整拟合模型的系数?

最佳答案

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

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

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

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'/sii>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,...)) 用于 mc(sd(response),rep(1,...)) 用于 s(即 ms 是变量移动的值)和缩放)。
  • 如果仅缩放预测变量而不缩放响应,则提交 c(0,mean(predictors))mc(1,sd(predictors))s .
  • 关于r - 如何从带有缩放响应的 lmer() 模型中取消缩放系数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23642111/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com