【问题标题】:How to unscale the coefficients from an lmer()-model fitted with a scaled response如何从配备缩放响应的 lmer() 模型中取消缩放系数
【发布时间】:2014-07-01 18:26:14
【问题描述】:

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

    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()-model 后简单地反转这个过程吗?

感谢您的帮助!


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

【问题讨论】:

  • 我不确定是否有一种简单的方法可以“取消缩放”后一个过程(即分别缩放每个主题)——这对我来说真的感觉像是一个不同的模型......我'我也不完全确定你为什么要...
  • 我怀疑这一点。不管我如何写下模型,我都没有想出一个合理的方法来重新缩放。我非常同意这个程序很奇怪。但它可以在一些论文中找到。我不明白你为什么要将每个主题的响应标准化并允许随机截取。这似乎是解决同一个问题的两件事;甚至可能低估了适当的个体差异。但是非常感谢您尝试提出答案!

标签: r mean lme4 lmer


【解决方案1】:

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

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

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

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&gt;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,...)) for mc(sd(response),rep(1,...)) for s(即,ms 是变量进行了移位和缩放)。
  • 如果您仅缩放预测变量而不缩放响应,则为m 提交c(0,mean(predictors)),为s 提交c(1,sd(predictors))

【讨论】:

  • 您似乎已经缩放了自变量icol &lt;- which(colnames(state.x77)=="Illiteracy")ss &lt;- state.x77ss[,-icol] &lt;- scale(ss[,-icol])。但我在设计中缩放了因变量。所以我使用state.x77 数据所做的是:m1Sy &lt;- lm(scale(Illiteracy)~.,as.data.frame(state.x77))。现在我在模型输出中得到 z 变换系数,我想反转它以在原始尺度上绘制均值。但也许我误解了你的解决方案。
  • 如果一些背景知识是有帮助的:似乎有一种强烈的趋势来衡量序数响应并在某些学科中适合lmer()。不仅我怀疑这是合理的(序数变量),而且我发现自己在问他们如何恢复原始比例,例如绘制平均值(评级)和误差线时。强相关:lmer() vs clmm() with ordinal response
  • 哎呀,回答错了问题 - 将回到这个问题。
  • 非常感谢!我真的很感激这一点。我刚刚意识到自己的不精确:当然,我的意思是按 VP 缩放响应变量。所以,想象一下我有一个从 1 到 5 的评分标准,我希望一些 VP 有强烈的倾向,只使用极端值,我想对此进行纠正。然后我可以采用平均响应(我知道,对于序数量表来说太可怕了......!)和每个受试者的标准偏差并标准化每个受试者的反应。鉴于随机拦截,这在 lmer() 中似乎毫无意义。(?)我应该更新我的问题以反映这一点。
猜你喜欢
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
  • 2021-09-16
  • 2017-12-23
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多