在R中使用变量作为列名来拟合glm

4

我正在尝试使用一个变量而不是列名在R中拟合glm(),但它无法正常工作。这可以帮助我自动生成glms。当我使用列名拟合glm时,程序运行良好;当我用包含列名的变量替换列名时,程序出错了。

以下是我的命令:

##The data
mydata <- structure(list(var1 = c(10L, 100L, 50L, 40L, 20L, 50L, 60L, 55L, 
45L), var2 = c(1.5, 1.2, 1, 1.4, 1.2, 1.4, 1.3, 1.4, 1.3), var3 = c(5L, 
3L, 4L, 1L, 5L, 2L, 7L, 5L, 4L), group = structure(c(1L, 1L, 
2L, 2L, 1L, 1L, 2L, 1L, 1L), .Label = c("A", "B"), class = "factor")), .Names = c("var1", 
"var2", "var3", "group"), class = "data.frame", row.names = c(NA, 
-9L))
## My variable
x <- c("var1+var2")
##Fitting the model
myglm <- glm(formula = group ~ var1+var2 , family = "binomial", data = mydata) ## works fine


myglm2 <- glm(formula = group ~ x , family = "binomial", data = mydata)
Error in model.frame.default(formula = group ~ x, data = mydata, drop.unused.levels = TRUE) : 
  variable lengths differ (found for 'x')

我曾尝试使用paste(x)cat(x)函数,但没有成功。在R中有解决方法吗?我需要使用这个功能,因为我正在使用for循环制作大约1000个glm

3个回答

8

使用as.formula更方便地进行编辑:

valid.names <- names(mydata)[names(mydata) != "group"]  # all but group
for(i in 2:length(valid.names)) {
  frm <- as.formula(paste("group ~", valid.names[i - 1], "+" , valid.names[i]))
  myglm <- glm(formula = frm, family = "binomial", data = mydata) ## works fine
}

旧版本

下面是使用parse的潜在解决方案:

valid.names <- names(mydata[, -4])  # all but group
frm <- group ~ x
for(i in 2:length(valid.names)) {
  varplusvar <- parse(text=paste(valid.names[i - 1], "+" , valid.names[i]))[[1]]
  frm[[3]] <- varplusvar
  myglm <- glm(formula = frm, family = "binomial", data = mydata) ## works fine
}

7

使用函数reformulate可以很方便地根据字符串创建公式。无需使用paste:

x <- c("var1+var2")

form <- reformulate(x, response = "group")
# group ~ var1 + var2

glm(formula = form , family = "binomial", data = mydata)

2

as.formula让它变得非常容易。对于这个特定的例子,使用您在问题中创建的数据:

mytarget <- "group"

myFormula <- as.formula(paste(mytarget,"~ var1 + var2"))

myglm <- glm(myFormula, family = "binomial", data = mydata)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接