2017-12-26 25 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 

행복 레벨은 사람이 사는 곳의 'happiness level'과 'city'입니다. '성별'코드 0 = 남자 1 = 여자. '고용'은 0 = 실업자이고 1 = 고용 됨. 'Worktype'은 '실업자', 'Whitecolor', 'Bluecolor'의 세 가지 레벨 요소입니다. '휴일'은 일주일에 며칠 씩 쉬는 날입니다. 여기서 '도시', '성별', '작업 유형'및 '휴일'변수가 모두 요인입니다. '행복'과 '고용'변수 유형은 숫자입니다.

내가 추정 할 모델

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이 Employment를 다루지 않는 이유는 확실하지 않습니다. WorktypeUnemployed는 분명히 0입니다. Worktype = 0을 0으로 지정하고 모델에서이를 제거하지 않습니다. 이것은 R이 Employment : HolidayUnemployed를 기준으로 설정했기 때문에 가능하며 둘 다 완벽하게 다중 선상에 있습니까? ('Worktype'과 'Holiday'의 '실업자'값을 '실업자'에 비해 'Worktype'과 'Holiday'의 효과를보고 싶었 기 때문에 붙여야했습니다.) '실업자'값 NA를 제거하면 NA가 사라지고, '실업자'와 비교할 때 'Whitecolor'와 '1day a week'로 표시됩니다.)

만약 그렇다면 왜 '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 = "실업자"인 경우는 분명하지 않기 때문에 특정 계수는 결정되지 않습니다. 그것은 다른 계수의 계산에 영향을주지 않는다 : 수동 가변 수를 부호화하여 확인할 수

> 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:h2 (Employment:Holiday2 day a week에 해당)에 대해 존재합니다. 이 축소 된 데이터 집합에서 단 하나의 모델 행렬 (즉,하나의 열은 다른 열의 선형 조합입니다)

> 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

그러면 기본적으로 취업에 NA를 설정하는 데 문제가 없습니다. worktypeunemployed. 나는 약 데이터 집합을 가지고있다. 9000 샘플. 실제 분석에서 나는 더 많은 변수를 가진 더 큰 모델을 추정한다. 나는 여전히 여러 가지 변수로 NAs를 얻는다. 각 직업 관련 변수에 대한 모든 마지막 상호 작용 용어에 대해 NAs를 얻으므로 혼란 스럽습니다. –

+0

동일한 관측에 대해 모든 변수에 '실업'값을 갖는 데 문제가 없습니까? 나는 실제 모델에서 '실업'값을 가진 네 가지 변수를 가지고있다. –

+0

R은 특이성의 문제가있을 때, 즉 모델 행렬의 열 중 하나가 다른 행렬의 선형 조합 일 때 마지막 상호 작용 항을 삭제합니다. 'alias (reg)'함수는 문제를 일으키는 용어를 검사하는 데 사용할 수 있습니다. 이 문제를 피하려면 중복성을 줄이기 위해 코딩을 조정해야합니다. 위의 예제는'reg <- lm (Happiness ~ City + Gender + Employment + Whitecolor + h2, data)'를 사용하면 잘 작동합니다. 여기서'Employment'는 연중 무휴로 일주일의 블루 칼라를 나타냅니다. –