2017-11-26 7 views
3

私はRで単純な線形回帰モデルを実行しようとしています。Rの線形回帰を行うとき、条件付きで因子のNA観測を落とす方法はありますか?

モデルに3つの要因変数があります。

モデルは「行使」は数値従属変数、時間の量、運動である

lm(Exercise ~ Econ + Job + Position) 

です。

"Econ"、 "Job"、 "Position"はすべて要因変数です。

「Econ」は、雇用者であるかどうかを表します。 (レベル=雇用/未雇用)

「ジョブ」は、職種です。この変数には5つのレベルがあります。

「位置」とは、職場にいる人の位置です。この変数には5つのレベルもあります。

私がもし「イーコンは」「失業者」、「仕事に等しいため、このエラーは、要因のレベルにNAが原因だと思う線形回帰を実行しようとしましたとエラーを得た、

"contrasts can be applied only to factors with 2 or more levels" 

「位置」にはNA値があります。 (明らかに、失業者には仕事の種類や仕事の位置がありません)

以下のように別々に2モデルを回帰すると、エラーは発生しません。

lm(Exercise ~ Econ) 

lm(Exercise ~ Job + Position) 

はしかし、私は必要に応じて自動的に変数を使用することができる一つのモデル、および1つの結果テーブルが欲しいです。したがって、「Econ」が「雇用」の場合、「ジョブ」、「位置」変数が回帰に使用されます。 "Econ"が "unemployed"の場合、 "Job"、 "Position"変数は自動的にモデルから削除されます。

代わりに2つのモデルの一つのモデルは、モデル内のすべての変数を入れている私が欲しい理由は、私が

場合は、「採用」している人々の間で「イーコン」(採用や失業者)の効果を見ることができますIただ回帰

lm(Exercise ~ Job + Position) 

私は雇用の影響を知らない。

"Job"と "Position"のすべてのNA値に対して0 = '失業率'を設定する解決策を考えましたが、これが問題を解決するかどうかわからないので、これがマルチ共線性問題につながる可能性があります。

他の要因変数に基づいてNA観測値を自動的に/条件付きで削除する方法はありますか?

以下は私の再現可能な例です。私が欲しいもの

ここ
Exercise <- c(50, 30, 25, 44, 32, 50 ,22, 14) 
    Econ <- as.factor(c(1, 0, 1, 1, 0, 0, 1, 1)) 
    # 0 = unemployed, 1 = employed 

    Job <- as.factor(c("A", NA, "B", "B", NA, NA, "A", "C")) 

    Position <- as.factor(c("Owner", NA,"Employee", "Owner", 
         NA, NA, "Employee", "Director")) 

    data <- data.frame(Exercise, Econ, Job, Position) 

    str(data) 

    lm(Exercise ~ Econ + Job + Position) 

    lm(Exercise ~ Econ) 

    lm(Exercise ~ Job + Position) 

は、最初のモデルのLM(運動〜イーコン+仕事+ポジション)ですが、すべてのイーコン= 0(無職)のために、仕事やポジション値がNAであるので、私は、エラーを取得します。

+1

「lm_model < - lm(Exercise〜Econ + Job + Position)」のように間違って設定している可能性がありますか? –

+0

ありがとうございました。それはちょうどここに書いて間違いだった..私は正しくRでコードを書いていたので、そうではない... –

+2

再現可能な例を提供しようとする... – Christoph

答えて

2

実際に最初のモデルをエラーなしで実行したい場合(使用しているのと同じ欠損値を仮定)、これを行うことができます。

lm(Exercise ~ as.integer(Econ) + Job + Position) 

実際に行ったことはすべて、3番目のモデルと同じ結果になります。

lm(Exercise ~ Job + Position) # third model 
lm(Exercise ~ as.integer(Econ) + Job + Position) # first model 

coef(lm(Exercise ~ Job + Position)) 
coef(lm(Exercise ~ as.integer(Econ) + Job + Position)) 

あなたは欠損値を処理する方法を変更しない限り、あなたはlm(Exercise ~ Econ + Job + Position)は、3番目のモデルlm(Exercise ~ Job + Position)と同等になりたい最初のモデルはここ理由です。

デフォルトでは、lm機能内のna.action = na.omitです。つまり、予測変数または応答変数の値が欠落している行はすべて削除されます。これを見ることができる方法はいくつかあります。 1つはlmがフードの下で何をするのかをmodel.matrixに適用することです。

model.matrix(Exercise ~ Econ + Job + Position) 
    (Intercept) Econ1 JobB JobC PositionEmployee PositionOwner 
1   1  1 0 0    0    1 
3   1  1 1 0    1    0 
4   1  1 1 0    0    1 
7   1  1 0 0    1    0 
8   1  1 0 1    0    0 

すでに正しく指摘したように、Econ = 0は完全にposition = NAと整列されます。したがって、lmはこれらの観測値を削除しており、Econは単一の値を持ちます。lmは、単一のレベルの係数の処理方法がわかりません。 as.integer()を使用してこのエラーをバイパスしましたが、依然として単一の値を持つプレディクタで終了します。

次に、lmはそのような予測子を黙って削除します。そのため、as.integer(Econ)の係数にはNAが表示されます。デフォルトはsingular.ok = TRUEです。

singular.ok = FALSEを設定した場合、基本的に予測子に単一の値しか持たないモデルに適合しようとしているというエラーが表示されます。

lm(Exercise ~ as.integer(Econ) + Job + Position, singular.ok = FALSE) 
Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 
    singular fit encountered 
関連する問題