Anna Bokovskaya Anna Bokovskaya - 11 months ago 163
R Question

How can I create a new formula that removes all the coefficients that have NA in the summary?

When I use simple lm function. I have NA for some coefficients.
How can I create a new formula that removes all the coefficients that have NA in the summary?

Example:

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


And I want that for the group setosa the formula will be without Petal.Width.

just:
Sepal.Length~Sepal.Width + Petal.Length + SomeFactor2+ SomeFactor3
.

Usually, I use step function. and then take the formula from the model.
but it takes a lot of time. and reduce a lot of coefficients.

Answer Source

Use drop.terms to, guess, drop the problem term. You will need to be carefull with the intercept term, it's in the formula by default. That's why I subtract 1 from which below.

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"]]
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download