当我使用简单的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函数。然后从模型中获取公式。 但这需要很多时间。并减少很多系数。
答案 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;亚种,因为它对该变量没有变异性。