2017-12-26 5 views
0

ニューヨークとシカゴに住む人々の幸福度の違いを決定する要因を推定しようとしています。ダミー変数のインタラクション期間で回帰するときのNA値

データは以下のようになります。

Happiness  City Gender Employment Worktype  Holiday 
1  60 New York  0  0  Unemployed Unemployed 
2  80 Chicago  1  1  Whitecolor 1 day a week 
3  39 Chicago  0  0  Unemployed Unemployed 
4  40 New York  1  0  Unemployed Unemployed 
5  69 Chicago  1  1  Bluecolor 2 day a week 
6  90 Chicago  1  1  Bluecolor 2 day a week 
7  100 New York  0  1  Whitecolor 2 day a week 
8  30 New York  1  1  Whitecolor 1 day a week 

幸福度は従属変数で、「都市」は人が住む場所です。 「性別」はコード化されています0 =男1 =女性。 「雇用」は0 =失業者であり、1 =雇用者である。 「ワークタイプ」は、「失業者」、「ホワイトカラー」、「ブルーカラー」の3つのレベル要素です。 「休日」とは、1週間に人が何日間休むかを指します。ここで、「都市」、「性別」、「ワークタイプ」、「休日」の変数はすべて要因です。 「幸福」と「雇用」変数タイプは数値です。

Iを推定するモデルは

lm(Happiness ~ City + Gender + Employment:(Worktype + Holiday)) 

である '雇用' が0(無職)に等しい場合ので、私は、数値として0を '雇用' の値を左:(Worktype +ホリデー)= 0、モデルは自動的に

lm(Happiness ~ City + Gender) 

失業者に縮小されます。

ただし、回帰結果はNA値を返します。

Coefficients: (2 not defined because of singularities) 
           Estimate Std. Error t value Pr(>|t|) 
(Intercept)      56.75  23.56 2.408 0.138 
CityNew York      -14.50  27.21 -0.533 0.647 
Gender1       -2.25  35.99 -0.063 0.956 
Employment:WorktypeBluecolor  25.00  43.02 0.581 0.620 
Employment:WorktypeUnemployed  NA   NA  NA  NA 
Employment:WorktypeWhitecolor  57.75  35.99 1.604 0.250 
Employment:Holiday1 day a week -50.00  54.42 -0.919 0.455 
Employment:Holiday2 day a week  NA   NA  NA  NA 

これは、「Worktype」および「Holiday」変数の「Unemployment」値によるものと思われます。しかし、私はRがなぜ雇用を扱っていないのか分かりません:WorktypeUnemployedは明らかに0です:Worktype = 0をゼロとして、それをモデルから削除しません。これはRがEmployment:HolidayUnemployedをベースラインとして設定しており、どちらも完全にマルチ共線性であるためですか? (私は 'Worktype'と 'Holiday'の 'Unemployed' valueを 'Untployed'に比べて 'Worktype'と 'Holiday'の効果を見たいので、母集団は「Whitecolor」と「1週間に1週間」なので、「失業者」と比較してその効果はわかりません)。

もしそうなら、「Employment:Holiday2day for week」の係数のNAはどうして得られますか?それは「失業者」の価値とは関係がないようです。

NA係数を削除するだけでこの結果に頼ることはできますか?

以下は再現可能なコードです。

Happiness <- c(60, 80, 39, 40, 69, 90, 100, 30) 

City <- as.factor(c("New York", "Chicago", "Chicago", "New York", "Chicago",   
        "Chicago", "New York", "New York")) 
Gender <- as.factor(c(0, 1, 0, 1, 1, 1, 0, 1)) # 0 = man, 1 = woman. 
Employment <- c(0,1, 0, 0, 1 ,1 , 1 , 1) # 0 = unemployed, 1 = employed. 
Worktype <- as.factor(c("Unemployed", "Whitecolor", "Unemployed",  
      "Unemployed", "Bluecolor", "Bluecolor", "Whitecolor","Whitecolor")) 
Holiday <- as.factor(c(0, 1, 0, 0, 2, 2, 2, 1)) 
levels(Holiday) <- c("Unemployed", "1 day a week", "2 day a week") 

data <- data.frame(Happiness, City, Gender, Employment, Worktype, Holiday) 

head(data,8) 
str(data) 

reg <- lm(Happiness ~ City + Gender + Employment:(Worktype + Holiday)) 
summary(reg) 

答えて

2

Employment:WorktypeUnemployedのNA値は心配する必要はありません。 Rは自動的にすべての相互作用を計算しようとしますが、明らかにEmployment = 1およびWorktype = "Unemployed"というケースは決してないので、その特定の係数は未定です。これは、他の係数の計算には影響しません。

> library(lme4) # for the convenient "dummy" function 
> data <- data.frame(data, 
+ dummy(Worktype, c("Bluecolor","Whitecolor")), 
+ h1=dummy(Holiday)[,1], 
+ h2=dummy(Holiday)[,2]) 
> 
> reg <- lm(Happiness ~ City + Gender + Employment:Bluecolor + Employment:Whitecolor + Employment:h1 + Employment:h2 , data) 
> summary(reg) 

Call: 
lm(formula = Happiness ~ City + Gender + Employment:Bluecolor + 
    Employment:Whitecolor + Employment:h1 + Employment:h2, data = data) 

Residuals: 
     1   2   3   4   5   6   7   8 
1.775e+01 1.775e+01 -1.775e+01 8.882e-16 -1.050e+01 1.050e+01 4.441e-15 -1.775e+01 

Coefficients: (1 not defined because of singularities) 
         Estimate Std. Error t value Pr(>|t|) 
(Intercept)    56.75  23.56 2.408 0.138 
CityNew York   -14.50  27.21 -0.533 0.647 
Gender1     -2.25  35.99 -0.063 0.956 
Employment:Bluecolor  25.00  43.02 0.581 0.620 
Employment:Whitecolor 57.75  35.99 1.604 0.250 
Employment:h1   -50.00  54.42 -0.919 0.455 
Employment:h2    NA   NA  NA  NA 

Residual standard error: 27.21 on 2 degrees of freedom 
Multiple R-squared: 0.6798, Adjusted R-squared: -0.1208 
F-statistic: 0.8491 on 5 and 2 DF, p-value: 0.619 

推定された係数がEmployment:WorktypeUnemployedはもう存在しない場合でも同じです:手動でダミー変数を符号化することによって確認することができます。

しかし、NA値は、Employment:h2Employment:Holiday2 day a weekに相当)については依然として存在します。これは、この縮小されたデータセットでは、特異モデル行列(すなわち、1列は他の列の線形結合です)

> solve(crossprod(model.matrix(reg))) 
Error in solve.default(crossprod(model.matrix(reg))) : 
    system is computationally singular: reciprocal condition number = 1.79897e-18 

この問題は、大きなデータセットでは発生しない可能性があります。最終的にモデルの冗長性を取り除こうとすることもできます(たとえば、休日の0日に雇用されている人はいますか?そうでない場合は1日がベースラインになり、休日の日のコードに余分な列を追加します> 1)。 alias()関数を使用して、問題を引き起こしている用語を確認することができます。

+0

したがって、基本的には、Employment:worktypeunemployedにNAを設定することに問題はありません。私は約とデータセットを持っています。 9000サンプル。実際の分析では、より多くの変数を持つより大きなモデルを推定します。まだいくつかの変数でNAを取得します。私は、仕事関連の変数ごとに最後のインタラクション期間ごとにNAを取得しているので、混乱しています。 –

+0

同じ観測値のすべての変数に「失業」値があることに問題はありませんか?実際のモデルには「失業者」という4つの変数があります。 –

+0

Rは、特異点の問題があるとき、すなわちモデル行列の列の1つが他のものの線形結合であるときの最後の相互作用項を削除する。関数 'alias(reg)'は、どの用語が問題を引き起こしているかを検査するために使用できます。問題を回避するには、冗長性を減らすためにコーディングを調整する必要があります。上記の例は 'reg < - lm(Happiness〜City + Gender + Employment + Whitecolor + h2、data)'を使うとうまくいきます。ここで、 'Employment'は週1日休みのBlue-collarを示しています。 –

関連する問題