reghelper::beta 只是对我们数据集中的数值变量进行标准化。因此,假设您的分类变量是 factors 而不是数字虚拟变量或其他对比编码,我们可以相当简单地将数据集中的数字变量标准化
vars <- grep('^continuous(.*)?', all.vars(formula(model)))
f <- function(var, data)
scale(data[[var]])
data[, vars] <- lapply(vars, f, data = data)
update(model, data = data)
现在对于更一般的情况,我们可以或多或少地创建我们自己的beta.merMod 函数。但是,我们需要考虑标准化y 是否有意义。例如,如果我们有一个poisson 模型,那么只有正整数值才有意义。另外一个问题变成了是否要缩放随机斜率效应,以及首先问这个问题是否有意义。在其中我假设分类变量被编码为character 或factor 而不是numeric 或integer。
beta.merMod <- function(model,
x = TRUE,
y = !family(model) %in% c('binomial', 'poisson'),
ran_eff = FALSE,
skip = NULL,
...){
# Extract all names from the model formula
vars <- all.vars(form <- formula(model))
lhs <- all.vars(form[[2]])
# Get random effects from the
ranef <- names(ranef(model))
# Remove ranef and lhs from vars
rhs <- vars[!vars %in% c(lhs, ranef)]
# extract the data used for the model
env <- environment(form)
call <- getCall(model)
data <- get(dname <- as.character(call$data), envir = env)
# standardize the dataset
vars <- character()
if(isTRUE(x))
vars <- c(vars, rhs)
if(isTRUE(y))
vars <- c(vars, lhs)
if(isTRUE(ran_eff))
vars <- c(vars, ranef)
data[, vars] <- lapply(vars, function(var){
if(is.numeric(data[[var]]))
data[[var]] <- scale(data[[var]])
data[[var]]
})
# Update the model and change the data into the new data.
update(model, data = data)
}
该函数适用于线性和广义线性混合效应模型(未针对非线性模型进行测试),并且与reghelper中的其他beta函数一样使用
library(reghelper)
library(lme4)
# Linear mixed effect model
fm1 <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy)
fm2 <- beta(fm1)
fixef(fm1) - fixef(fm2)
(Intercept) Days
-47.10279 -19.68157
# Generalized mixed effect model
data(cbpp)
# create numeric variable correlated with period
cbpp$nv <-
rnorm(nrow(cbpp), mean = as.numeric(levels(cbpp$period))[as.numeric(cbpp$period)])
gm1 <- glmer(cbind(incidence, size - incidence) ~ nv + (1 | herd),
family = binomial, data = cbpp)
gm2 <- beta(gm1)
fixef(gm1) - fixef(gm2)
(Intercept) nv
0.5946322 0.1401114
但请注意,与beta 不同,该函数返回更新的模型,而不是模型的摘要。
另一个问题是该模型包含几个连续预测变量(它们在相似的尺度上运行)和 2 个分类预测变量(一个有 4 个级别,一个有六个级别)。使用标准化系数的目的是将分类预测变量的影响与连续变量的影响进行比较,我不确定标准化系数是否适合这样做。标准化系数是一种可接受的方法吗?
现在这是一个很好的问题,更适合stats.stackexchange,我不确定答案。