在ifelse条件下使用lm()

时间:2017-07-12 14:35:08

标签: r lapply lm

我正在尝试使用lapply运行几个回归。我想使用ifelse条件来区分要运行的回归。但是,当我使用ifelse时,输出不是lm对象。我附上了重现我的问题的代码。请帮忙。

attach(iris)

names.list = c('a','b','c')

models.work = lapply(names.list,
                    function(f)
                      {
                      lm(Sepal.Length~Sepal.Width,data=iris)
                     })

models.not.work = lapply(names.list,
                     function(f)
                     {
                      ifelse(1==1,
                      lm(Sepal.Length~Sepal.Width,data=iris),
                      lm(Sepal.Length~Sepal.Width,data=iris)
                      )
                     })

2 个答案:

答案 0 :(得分:2)

ifelse表示会返回:

  

具有相同长度和属性的矢量(包括尺寸和尺寸)   “阶级”)作为考试

其中test是输入。您的输入为1==1(顺便提一下,您可以使用TRUE),输入长度为1.因此ifelse将返回长度为1的内容。lm返回一个列表,以便它只返回该列表中的第一个元素。这恰好是系数。

ifelse不是您想要在这里使用的。目前还不清楚你真正想要做什么,但最有可能找到实现目标的更好方法。

如果你手动循环遍历这些元素,你可能只想使用普通的if语句。如果你解释一下你实际上想做什么,可能有更好的方法。

答案 1 :(得分:0)

在这种情况下,

ifelse无法返回模型对象。使用正常的if - else子句,应该这样做。

attach(iris)

names.list = c('a','b','c')
models.not.work = lapply(names.list,
                         function(f)
                         {
                           if(1==1){
                                  lm(Sepal.Length~Sepal.Width,data=iris)}else{
                                  lm(Sepal.Length~Sepal.Width,data=iris)
                                  }

                         })


#output

> models.not.work[[1]]

Call:
lm(formula = Sepal.Length ~ Sepal.Width, data = iris)

Coefficients:
(Intercept)  Sepal.Width  
     6.5262      -0.2234