2017-09-28 5 views
1

私は単純なlm関数を使用します。いくつかの係数にはNAがあります。 要約に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 

そして、私はグループのための式はPetal.Widthなしになるsetosaことをしたいです。

ちょうど:Sepal.Length~Sepal.Width + Petal.Length + SomeFactor2+ SomeFactor3

通常、ステップ関数を使用します。モデルから数式を取得します。 しかし、それには多くの時間がかかります。多くの係数を減らすことができます。

答えて

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"]] 
+0

これは素晴らしいです。しかし、少し問題があります:彼にはNAがあるが、数式に係数がある場合、それは特定の要因の後に来る、drop.termsは彼を削除しません。 –

+0

@AnnaBokovskaya質問の編集例を挙げることはできますか?もしそうなら、私はすぐにそれを見ることができるように、最後に入れてください。 –

+0

ねえ、私は答えを編集しました。 –

1

あなたが勉強している虹彩のサブセットの花びらの幅にばらつきがないので、係数としてNAを取得します。 別のモデルが必要な場合は、データのサブセットを作成し、そのサブセットでlmを使用するだけです。私はあなたが作った反復でそれをしません。また、段階的回帰法を使用することもできます。そして、その変数に変動性がないので、花輪の幅は 'セットサ'亜種のために除外されます。

関連する問題