2016-11-17 9 views
1

두 개의 범주 형 예측 변수 (a, b)와 이진 대상 (y) 변수가 포함 된 데이터 집합이 있다고 가정합니다.요인 참조 셀 코딩에 의해 도입 된 선형 상관 변수를 무시하는 방법

> df <- data.frame(
> a = factor(c("cat1","cat2","cat3","cat1","cat2")), 
> b = factor(c("cat1","cat1","cat3","cat2","cat2")), 
> y = factor(c(T,F,T,F,T)) 
>) 

다음의 논리 관계는 데이터에 존재 :

if (a = cat3) then (b = cat3 and y = true) 
else if (a = b) then (y = true) else y = false 

내가 내 데이터 세트에 대한 모델을 구축 할 glm를 사용하고 싶습니다. glm은 내 범주 형 변수 a 및 b에 대한 참조 셀 코딩을 자동으로 적용합니다. 또한 alias 변수가 도입되지 않도록 각 요인 변수에 적합한 코드 번호를 찾는 데 도움이됩니다 (here 설명).

그러나 위의 데이터 세트 에서처럼 변수 a에 대해 생성 된 하나의 참조 코드와 변수 b의 하나의 참조 코드간에 선형 관계가 존재할 수 있습니다.

내 모델의 출력을 참조하십시오

> model <- glm(y ~ ., family=binomial(link='logit'), data=df) 
> summary(model) 
... 
Coefficients: (1 not defined because of singularities) 
      Estimate Std. Error z value Pr(>|z|) 
(Intercept) 1.965e-16 1.732e+00 0.000 1.000 
acat2  -2.396e-16 2.000e+00 0.000 1.000 
acat3  1.857e+01 6.523e+03 0.003 0.998 
bcat2  0.000e+00 2.000e+00 0.000 1.000 
bcat3    NA   NA  NA  NA # <- get rid of this? 
나는이 사건을 처리하는 방법을

? 생성 된 참조 코드 중 일부를 생략하도록 glm에 지시 할 수 있습니까? 실제 문제는 내 "cat3" 값이 NA에 해당합니다. 두 개의 의미있는 요소 변수가 내 데이터 집합의 정확히 동일한 인스턴스에 NA 있습니다.

편집 :

이 확인 된 답변이 코멘트에서 지적하지만,이 특정한 경우에 특이성이 단순히 무시 될 수있다, 문제를 해결한다.

+0

@ ZheyuanLi : 질문 제기에 감사드립니다. 특이점이 모델 (예 : 알고리즘 수렴 속도)에 부정적인 영향을 미칠 수 있는지 확실하지 않았기 때문에 올바르게 이해하면 이러한 특이점을 무시하고 예측 된 모델을 그대로 사용할 수 있습니까? – fab

답변

0

이 질문에 대한 의견은 적절하지만 NA 모델 행렬을 제거하여 동등성과 관련하여 자신을 만족시키기 위해 그러한 제거를하지 않는 것과 비교할 수는 있습니다.

model <- glm(y ~ ., family=binomial(link='logit'), data=df) # as in question 

mm <- model.matrix(model)[, !is.na(coef(model)) ] 
df0 <- data.frame(y = df$y, mm[, -1]) 
update(model, data = df0) 

주는 : 당신은을 사용하지 않으려면 것을

Call: glm(formula = y ~ ., family = binomial(link = "logit"), data = df0) 

Coefficients: 
(Intercept)  acat2  acat3  bcat2 
    1.965e-16 -2.396e-16 1.857e+01 0.000e+00 

Degrees of Freedom: 4 Total (i.e. Null); 1 Residual 
Null Deviance:  6.73 
Residual Deviance: 5.545  AIC: 13.55 

특히

, 당신은 glm 두 번 두 번째 실행에 중복 모델 매트릭스 열을 제거 실행할 수 실제로 응답의 이름이 y라는 것을 알고 있다면 위의 df0으로 대입을 대체하는 응답과 이름을 추출 할 수 있습니다.

df0 <- data.frame(model.response(model.frame(model)), mm[, -1]) 
names(df0)[1] <- as.character(attr(terms(model), "variables")[[2]]) 
+0

model.matrix를 몰랐습니다. 내부적으로 glm에서도 사용하고 있습니까? 내 df에 더 많은 수치 변수가있는 경우 (그대로 유지) model.matrix에서 제외해야합니다. – fab

+0

나는 NA 계수를 갖는 모델 행렬 열을 제외시키고 자하는 질문을 이해하고 위의 코드는 모델 프레임의 열 유형에 관계없이이를 수행해야합니다. –