0

我有一大套模型规格要测试,它们共享一个 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 列表吗?

4

2 回答 2

3

Your problem is with how you are specifying the formula, since inside the function i is a variable. This would work:

glm(paste("dv ~", i), data = foo, family = binomial())
于 2012-08-07T15:57:32.797 回答
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()))

?step但是撇开统计问题不谈,使用类似或?stepAICMASS包中的东西可能更容易完成类似的任务?

于 2012-08-07T15:46:37.883 回答