データのサブセットのみで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()に入れる前に除外できます。しかし、私はこのことについてクラスを教えています。数式でマイナス記号を使用して変数を除外できることを生徒にすでに伝えているので、生徒を混乱させたくありません。
私は「拡張」し
—
作動
.
て単純化された式を取得しようとしてterms(y ~ . -x3, data=dt, simplify=TRUE)
いましたが、奇妙なことx3
に、それがlm
@MrFlick-Rに実装されてい
—
thelatemail
neg.out=
ないオプションが関連している可能性があります。以下のためのSのヘルプファイルからterms
、neg.out=
:実装されている 「 - 」記号フラグに入る用語の治療を制御します。TRUEの場合、キャンセルの条件がチェックされ、それ以外の場合は無視されます。FALSEの場合、負の条件が保持されます(負の順序で)。
@MauritsEvers:変更されたバージョンのデータを
—
Artem Sokolov
lm
呼び出しmodel.matrix
ます。最初にlm
、次の式を作成して評価しますmf <- stats::model.frame( y ~ . -x3, dt[x3=="men"], drop.unused.levels=TRUE )
。これによりx3
、単一レベルの要素になります。model.matrix()
次にmf
、元のデータではなくが呼び出され、結果としてエラーが発生します。
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
用語を削除するときに設計マトリックスをどのように作成して保存するかに関係しているということです。