从列表中传递glm预测变量

时间:2012-08-07 15:36:49

标签: r plyr

我有一大堆要测试的模型规格,它们共享一个dv但具有独特的IV。在以下示例中

foo <- data.frame(dv  = sample(c(0,1), 100, replace=T),
                  x1 = runif(100),
                  x2 = runif(100))

我希望第一个模型只包含x1,第二个x2,第三个模型和第四个模型。所以我认为一种明智的方法是建立一个公式陈述列表:

bar <- list("x1",
            "x2", 
            "x1+x2",
            "x1*x2")

然后我将在llply包的plyr调用中使用它来获取模型对象列表。

require(plyr)
res <- llply(bar, function(i) glm(dv ~ i, data = foo, family = binomial()))

不幸的是我被告知了

Error in model.frame.default(formula = dv ~ i, data = foo, drop.unused.levels = TRUE):variable lengths differ (found for 'i')

显然我正在混淆一些基本的东西 - 我是否需要以某种方式操纵原始的foo列表?

2 个答案:

答案 0 :(得分:3)

你的问题在于如何指定公式,因为在函数内部我是一个变量。这可行:

glm(paste("dv ~", i), data = foo, family = binomial())

答案 1 :(得分:2)

问题是dv ~ i不是公式。 i(在匿名函数内)只是一个符号,表示包含字符值的变量。

试试这个:

bar <- list("dv~x1",
            "dv~x2", 
            "dv~x1+x2",
            "dv~x1*x2")

res <- llply(bar, function(i) glm(i, data = foo, family = binomial()))

但是,除了设置统计问题之外,在 MASS 包中使用类似?step?stepAIC的内容可能会更容易吗?