lm式で変数を削除しても、コントラストエラーが発生する


9

データのサブセットのみでlm()を実行しようとしていますが、問題が発生しています。

dt = data.table(y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100), x3 = as.factor(c(rep('men',50), rep('women',50)))) # sample data

lm( y ~ ., dt) # Use all x: Works
lm( y ~ ., dt[x3 == 'men']) # Use all x, limit to men: doesn't work (as expected)

上記は機能しません。データセットに男性のみが含まれるため、性別変数x3をモデルに含めることができないためです。だが...

lm( y ~ . -x3, dt[x3 == 'men']) # Exclude x3, limit to men: STILL doesn't work
lm( y ~ x1 + x2, dt[x3 == 'men']) # Exclude x3, with different notation: works great

これは、数式の「マイナス記号」表記の問題ですか?アドバイスを下さい。注:もちろん、別の方法で行うこともできます。たとえば、変数をlm()に入れる前に除外できます。しかし、私はこのことについてクラスを教えています。数式でマイナス記号を使用して変数を除外できることを生徒にすでに伝えているので、生徒を混乱させたくありません。


3
これは、両方のことを面白いmodel.matrix(y ~ . - x3, data = dt[x3 == "men"])model.matrix(y ~ x1 + x2, data = dt[x3 == "men"])仕事(lm呼び出しmodel.matrix内部で)。両方のモデルマトリックスの唯一の違いは、"contrasts"属性(まだが含まれているx3)であり、後でlmルーチン内で取得されるため、表示されているエラーの原因となる可能性があります。つまり、問題は、model.matrix用語を削除するときに設計マトリックスをどのように作成して保存するかに関係しているということです。
Maurits Evers

私は「拡張」し.て単純化された式を取得しようとしてterms(y ~ . -x3, data=dt, simplify=TRUE)いましたが、奇妙なことx3に、それがlm
作動

1
@MrFlick-Rに実装されていneg.out=ないオプションが関連している可能性があります。以下のためのSのヘルプファイルからtermsneg.out=:実装されている 「 - 」記号フラグに入る用語の治療を制御します。TRUEの場合、キャンセルの条件がチェックされ、それ以外の場合は無視されます。FALSEの場合、負の条件が保持されます(負の順序で)。
thelatemail

1
@MauritsEvers:変更されたバージョンのデータをlm呼び出しmodel.matrixます。最初にlm、次の式を作成して評価しますmf <- stats::model.frame( y ~ . -x3, dt[x3=="men"], drop.unused.levels=TRUE )。これによりx3、単一レベルの要素になります。model.matrix()次にmf、元のデータではなくが呼び出され、結果としてエラーが発生します。
Artem Sokolov

回答:


2

発生しているエラーは、x3がモデルに1つの値=しかないためです"men"(@Artem Sokolovの以下のコメントを参照)。

これを解決する1つの方法は、事前にサブセット化することです。

dt = data.table(y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100), x3 = as.factor(c(rep('men',50), rep('women',50)))) # sample data

dmen<-dt[x3 == 'men'] # create a new subsetted dataset with just men

lm( y ~ ., dmen[,-"x3"]) # now drop the x3 column from the dataset (just for the model)

または、同じ手順で両方を行うことができます。

lm( y ~ ., dt[x3 == 'men',-"x3"])

全体として、これは素晴らしいソリューションです。正しいの一つは、ということです-x3式でないない原因lmあなたが列を引くしようとしていることを考えるように。「モデルでx3を使用しない」という意図は正しく伝えられていますが、問題は、lm呼び出しmodel.frame( ..., drop.unused.levels=TRUE )x3単一レベルの要因になり、のダウンストリーム問題につながることmodel.matrix()です。
Artem Sokolov

明確化してくれたArtem Sokolovに感謝します。私はその誤った説明を私の答えから取り出しました。
Dylan_Gomes
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.