如何在 R 的循环中包含 GLM
How do I include GLM in a loop in R
我的 GLM 模型工作正常,但为了加快速度,我想在循环中包含变量名称并让 R 为每个变量计算 GLM。所以我尝试了这个:
varlist <- c("age", "doc")
for (i in 1:length(varlist))
{
glmmodel <- glm(formula = Kommunikation ~ varlist[i], family = binomial, data = analysis_data)
univars[i,1] <- names(coef(glmmodel))[2]
univars[i,2] <- exp(confint.default(glmmodel)[2,1])
univars[i,3] <- exp(glmmodel$coefficients[2])
univars[i,4] <- exp(confint.default(glmmodel)[2,2])
}
不幸的是,这会导致错误:
Error in model.frame.default(formula = Kommunikation ~ varlist[[i]], data = analysis_data, :
variable lengths differ (found for 'varlist[[i]]')
当我将 varlist[i]
替换为相应的变量名称 age
和 doc
时 GLM 模型起作用,我猜这个问题源于 R 在以下情况下如何读取字符替换变量名? (我有 26 个变量,但只是为了方便才发布两个。)
问题是您试图在调用 glm()
时将字符串放入公式中。这是一种可能的解决方案,您将字符串传递给对 as.formula
的调用,然后在模型中使用该公式。
df <- data.frame(y = rbinom(10, 1, 0.5), x1 = rnorm(10), x2 = rnorm(10))
varlist <- c("x1", "x2")
univars <- data.frame() # create an empty data frame so the rest of your code works
for (i in seq_along(varlist))
{
mod <- as.formula(sprintf("y ~ %s", varlist[i]))
glmmodel <- glm(formula = mod, family = binomial, data = df)
univars[i,1] <- names(coef(glmmodel))[2]
univars[i,2] <- exp(confint.default(glmmodel)[2,1])
univars[i,3] <- exp(glmmodel$coefficients[2])
univars[i,4] <- exp(confint.default(glmmodel)[2,2])
}
结果:
> univars
V1 V2 V3 V4
1 x1 0.4728192 3.1185658 20.569074
2 x2 0.1665581 0.7241709 3.148592
此外,我倾向于使用 lapply
而不是 for
循环来执行此操作,从而生成可以绑定的行。但这有效。
我的 GLM 模型工作正常,但为了加快速度,我想在循环中包含变量名称并让 R 为每个变量计算 GLM。所以我尝试了这个:
varlist <- c("age", "doc")
for (i in 1:length(varlist))
{
glmmodel <- glm(formula = Kommunikation ~ varlist[i], family = binomial, data = analysis_data)
univars[i,1] <- names(coef(glmmodel))[2]
univars[i,2] <- exp(confint.default(glmmodel)[2,1])
univars[i,3] <- exp(glmmodel$coefficients[2])
univars[i,4] <- exp(confint.default(glmmodel)[2,2])
}
不幸的是,这会导致错误:
Error in model.frame.default(formula = Kommunikation ~ varlist[[i]], data = analysis_data, :
variable lengths differ (found for 'varlist[[i]]')
当我将 varlist[i]
替换为相应的变量名称 age
和 doc
时 GLM 模型起作用,我猜这个问题源于 R 在以下情况下如何读取字符替换变量名? (我有 26 个变量,但只是为了方便才发布两个。)
问题是您试图在调用 glm()
时将字符串放入公式中。这是一种可能的解决方案,您将字符串传递给对 as.formula
的调用,然后在模型中使用该公式。
df <- data.frame(y = rbinom(10, 1, 0.5), x1 = rnorm(10), x2 = rnorm(10))
varlist <- c("x1", "x2")
univars <- data.frame() # create an empty data frame so the rest of your code works
for (i in seq_along(varlist))
{
mod <- as.formula(sprintf("y ~ %s", varlist[i]))
glmmodel <- glm(formula = mod, family = binomial, data = df)
univars[i,1] <- names(coef(glmmodel))[2]
univars[i,2] <- exp(confint.default(glmmodel)[2,1])
univars[i,3] <- exp(glmmodel$coefficients[2])
univars[i,4] <- exp(confint.default(glmmodel)[2,2])
}
结果:
> univars
V1 V2 V3 V4
1 x1 0.4728192 3.1185658 20.569074
2 x2 0.1665581 0.7241709 3.148592
此外,我倾向于使用 lapply
而不是 for
循环来执行此操作,从而生成可以绑定的行。但这有效。