如何创建一个新公式,删除摘要中包含NA的所有系数?

时间:2017-09-28 13:47:30

标签: r

当我使用简单的lm函数时。我有一些系数的NA。 如何创建一个新公式,删除摘要中包含NA的所有系数?

示例

iris[which(iris$Species=="setosa"),]$Petal.Width<-1
iris$SomeFactor<-round(log(rgeom(n = nrow(iris),prob = 0.1)+1))
model<-list()
for(i in unique(iris$Species)){
  data<-iris[which(iris$Species==i),]
  model[[i]]<-lm(formula = formula("Sepal.Length~Sepal.Width + 
                                    Petal.Length + as.factor(SomeFactor)+ 
                                    Petal.Width"),data = data)
}
model[["setosa"]]

Call:
  lm(formula = formula("Sepal.Length~Sepal.Width + Petal.Length + Petal.Width"), 
     data = data)

Coefficients:
  (Intercept)   Sepal.Width  Petal.Length   Petal.Width  
2.3037        0.6674        0.2834            NA

我希望对于组setosa,公式将没有Petal.Width。

只是:Sepal.Length~Sepal.Width + Petal.Length + SomeFactor2+ SomeFactor3

通常,我使用step函数。然后从模型中获取公式。 但这需要很多时间。并减少很多系数。

2 个答案:

答案 0 :(得分:2)

使用drop.terms来猜测,删除问题术语。您需要注意截距项,默认情况下它在公式中。这就是我从下面的which中减去1的原因。

model<-list()
for(i in unique(iris$Species)){
  data<-iris[which(iris$Species==i),]
  model[[i]] <- lm(formula = formula("Sepal.Length~Sepal.Width + Petal.Length + Petal.Width"),data = data)
  if(any(is.na(coef(model[[i]])))){
    cf <- coef(model[[i]])
    fmla <- drop.terms(terms(model[[i]]), which(is.na(cf)) - 1, keep.response = TRUE)
    model[[i]] <- lm(fmla, data = data)
  }
}

model[["setosa"]]

答案 1 :(得分:1)

您获得NA作为系数,因为您正在研究的虹膜子集的花瓣宽度没有变化。 如果你想要一个单独的模型,我只需创建一个数据子集并在该子集上使用lm。我不会在你做的迭代中做到这一点。你也可以使用逐步回归方法,然后将花瓣的宽度留给'setosa&#39;亚种,因为它对该变量没有变异性。