2013-08-11 14 views
29

で線形モデルを定義する:エラー、私は次のようにRでの私の線形モデルを定義しようとするとR

lm1 <- lm(predictorvariable ~ x1+x2+x3, data=dataframe.df) 

私は、次のエラーメッセージが出ます:

Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
contrasts can be applied only to factors with 2 or more levels 

は、任意のはありますそれを無視するか、それを修正する方法?変数のいくつかは要因であり、一部は要因ではありません。

答えて

41

独立変数(RHS変数)が1つの値を取る係数または文字の場合、そのタイプのエラーが発生します。

例:R

内の虹彩データ今
(model1 <- lm(Sepal.Length ~ Sepal.Width + Species, data=iris)) 

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

# Coefficients: 
#  (Intercept)  Sepal.Width Speciesversicolor Speciesvirginica 
#   2.2514    0.8036    1.4587    1.9468 

、あなたのデータは一種のみで構成されている場合:

(model1 <- lm(Sepal.Length ~ Sepal.Width + Species, 
       data=iris[iris$Species == "setosa", ])) 
# Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
# contrasts can be applied only to factors with 2 or more levels 

変数が数値(Sepal.Width)が、単一の値のみと言うを取っている場合3の場合、モデルは実行されますが、次のようにその変数の係数としてNAが得られます。

解決策:従属変数には1つの値のみで十分なバリエーションがありません。だから、その変数が数値か文字か要素変数かどうかに関わらず、その変数を削除する必要があります。

コメントは次のようにコメントで更新されます:エラーはファクタ/キャラクタでのみ発生することがわかっているので、これらのファクタ変数のレベルの長さが1(DROP) 1(NODROP)。そして、あなたが見つけ、今だけ

m <- iris[, l] 

因子変数のデータフレームを取得することができます

(l <- sapply(iris, function(x) is.factor(x))) 
# Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
#  FALSE  FALSE  FALSE  FALSE   TRUE 

次のコードを使用して、変数が要因であるかどうか、確認するには

要因変数のレベル数(その変数を削除する必要がある場合)

ifelse(n <- sapply(m, function(x) length(levels(x))) == 1, "DROP", "NODROP") 

注:fアクター変数は1つだけです、それは変数です、あなたは落とす必要があります。

+0

ありがとうございました。私はこれをRで修正することができますか、それとも元のデータを編集する必要があるのでしょうか。また、データを見てみると、すべての変数が複数の値をとっていますか?彼らが参照している特定の変数を見る方法はありますか? – REnthusiast

+0

更新されたソリューションを参照し、因子変数にのみ焦点を当てます。 – Metrics

+0

また、変数に "エキゾチックな"文字が含まれている場合、同じエラーが表示されます。私はバグだと思います。私の変数CustomerTypeは、 "ö"を含む1つの値を持っています。変更したときにエラーが消えた – ErrantBard

12

あなたのプレディクタのうちの少なくとも1つがx1,x2、またはで、1つの因子レベルしかなく、したがって定数であるようです。

は異なる値を見つけるため

lapply(dataframe.df[c("x1", "x2", "x3")], unique) 

を見てください。

1

メトリクスとスヴェンは通常の状況でお答えしますが、英語以外の環境で働いている私たちにとっては、あなたのキャラクター変数にエキゾチックな文字(å、ä、ö)がある場合、同じ結果が得られます複数の因子レベル。Levels <- c("Pri", "For")これはおそらくバグではありません

んが

Levels <- c("Pri", "För")は、コントラストのエラーが発生します。因子変数を特定した後、第二sapplyは、各レベルに属するレコードの何パーセントを計算

0

これは@Metricsと@Max Ghenisで編集が提供する答えに変化が...

ここ
l <- sapply(iris, function(x) is.factor(x)) 
m <- iris[,l] 

n <- sapply(m, function(x) { y <- summary(x)/length(x) 
len <- length(y[y<0.005 | y>0.995]) 
cbind(len,t(y))}) 

drop_cols_df <- data.frame(var = names(l[l]), 
          status = ifelse(as.vector(t(n[1,]))==0,"NODROP","DROP"), 
          level1 = as.vector(t(n[2,])), 
          level2 = as.vector(t(n[3,]))) 

、 /変数のカテゴリ。その後、99.5%以上の発生率の0.5%以上の数(私の任意の閾値)を特定します。

次に、各カテゴリ変数の有効レベル数と各レベルの発生率を返します。

スレッショルドを超えるゼロレベルの変数は削除しないでください。もう1つは線形モデルから削除する必要があります。

最後のデータフレームは、結果の表示を容易にします。すべての因子変数が2項であるため、このデータセットはハードコードされています。このデータフレームは簡単に汎用性の高いものにすることができます。

0

このエラーメッセージは、データにNAが含まれている場合にも発生する可能性があります。

この場合、動作はデフォルトに依存し(ドキュメントを参照)、変数に記載されている列のNAのすべてのケースが静かに破棄されます。したがって、因子には実際にいくつかの結果があるかもしれませんが、因子はNAのものがない場合に限定すると、1つの結果しか得られません。

この場合、エラーを修正するには、モデルを変更するか(問題の要因を式から削除する)、またはデータを変更します(つまり、ケースを完了します)。

関連する問題