首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lmer模型的标准化系数

lmer模型的标准化系数
EN

Stack Overflow用户
提问于 2014-08-05 15:39:11
回答 2查看 7.3K关注 0票数 5

我曾经使用下面的代码来计算lmer模型的标准化系数。但是,随着新版本的lme,返回对象的结构发生了变化。

如何调整函数stdCoef.lmer使其与新的lme4版本一起工作?

代码语言:javascript
复制
# Install old version of lme 4
install.packages("lme4.0", type="both",
                 repos=c("http://lme4.r-forge.r-project.org/repos",
                         getOption("repos")[["CRAN"]]))

# Load package
detach("package:lme4", unload=TRUE)
library(lme4.0)

# Define function to get standardized coefficients from an lmer
# See: https://github.com/jebyrnes/ext-meta/blob/master/r/lmerMetaPrep.R
stdCoef.lmer <- function(object) {
  sdy <- sd(attr(object, "y"))
  sdx <- apply(attr(object, "X"), 2, sd)
  sc <- fixef(object)*sdx/sdy
  #mimic se.ranef from pacakge "arm"
  se.fixef <- function(obj) attr(summary(obj), "coefs")[,2]
  se <- se.fixef(object)*sdx/sdy
  return(list(stdcoef=sc, stdse=se))
}

# Run model
fm0 <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy)

# Get standardized coefficients
stdCoef.lmer(fm0)

# Comparison model with prescaled variables
fm0.comparison <- lmer(scale(Reaction) ~ scale(Days) + (scale(Days) | Subject), sleepstudy)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-05 18:59:42

@LeonardoBergamini的答案是可行的,但这个方法更简洁、更容易理解,而且只使用标准访问器--如果/当summary()输出的结构或拟合模型的内部结构发生变化时,将来不太可能中断。

代码语言:javascript
复制
stdCoef.merMod <- function(object) {
  sdy <- sd(getME(object,"y"))
  sdx <- apply(getME(object,"X"), 2, sd)
  sc <- fixef(object)*sdx/sdy
  se.fixef <- coef(summary(object))[,"Std. Error"]
  se <- se.fixef*sdx/sdy
  return(data.frame(stdcoef=sc, stdse=se))
}
library("lme4")
fm1 <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy)
fixef(fm1)
## (Intercept)        Days 
##   251.40510    10.46729
stdCoef.merMod(fm1)
##               stdcoef      stdse
## (Intercept) 0.0000000 0.00000000
## Days        0.5352302 0.07904178

(这确实给出了与stdCoef.lmer在@LeonardoBergamini中的答案相同的结果.)

您可以使用broom.mixed::tidy + dotwhisker::by_2sd获得部分缩放系数--以x的SD的2倍缩放,但不被SD(y)缩放,也不以中心为中心。

代码语言:javascript
复制
library(broom.mixed)
library(dotwhisker)
(fm1 
    |> tidy(effect="fixed") 
    |> by_2sd(data=sleepstudy) 
    |> dplyr::select(term, estimate, std.error)
)
票数 10
EN

Stack Overflow用户

发布于 2014-10-02 14:09:01

这应该是可行的:

代码语言:javascript
复制
stdCoef.lmer <- function(object) {
  sdy <- sd(attr(object, "resp")$y) # the y values are now in the 'y' slot 
  ###                                 of the resp attribute
  sdx <- apply(attr(object, "pp")$X, 2, sd) # And the X matriz is in the 'X' slot of the pp attr
  sc <- fixef(object)*sdx/sdy
  #mimic se.ranef from pacakge "arm"
  se.fixef <- function(obj) as.data.frame(summary(obj)[10])[,2] # last change - extracting 
  ##             the standard errors from the summary
  se <- se.fixef(object)*sdx/sdy
  return(data.frame(stdcoef=sc, stdse=se))
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25142901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档