lm 공식에서 변수를 삭제하면 여전히 대비 오류가 발생합니다.


9

내 데이터의 하위 집합에서만 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 ()에 넣기 전에 변수를 제외시킬 수 있습니다. 그러나 나는이 물건에 대해 수업을 가르치고 있으며, 학생들에게 혼동하고 싶지는 않습니다. 이미 학생들에게 수식에서 빼기 기호를 사용하여 변수를 제외 할 수 있다고 말했습니다.


3
그것은 모두 그 흥미 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용어를 제거 할 때 디자인 매트릭스를 작성하고 저장하는 방법과 관련이 있다는 것입니다 .
Maurits Evers

나는이 "확장"을 시도했다 .있는 간단한 공식을 얻을 수 terms(y ~ . -x3, data=dt, simplify=TRUE)있지만, 이상하게도 여전히 유지 x3까지 여행 변수 속성에lm
MrFlick

1
@MrFlick-구현되지 않은 R neg.out=옵션과 관련이있는 것 같습니다 . 의 S 도움말 파일에서 terms어디 neg.out=: 구현 "-"기호 입력하는 용어의 처리를 제어하는 플래그. 참이면 용어가 취소되었는지 확인하고 그렇지 않으면 무시합니다. FALSE이면 부정적인 용어가 유지됩니다 (음의 순서로).
thelatemail

1
@MauritsEvers : 수정 된 버전의 데이터를 lm호출 model.matrix합니다. 맨 처음에 lm다음 표현식을 작성하고 평가하십시오 mf <- stats::model.frame( y ~ . -x3, dt[x3=="men"], drop.unused.levels=TRUE ). 이것은 x3단일 레벨 요소가됩니다. model.matrix()그런 다음 mf원래 데이터가 아닌 에 호출되어 관찰중인 오류가 발생합니다.
Artem Sokolov

답변:


2

x3이 하나의 값으로 만 모델에 있기 때문에 오류가 발생합니다 "men"(@Artem Sokolov의 아래 주석 참조).

이를 해결하는 한 가지 방법은 미리 하위 세트를 만드는 것입니다.

dt = data.table(y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100), x3 = as.factor(c(rep('men',50), rep('women',50)))) # sample data

dmen<-dt[x3 == 'men'] # create a new subsetted dataset with just men

lm( y ~ ., dmen[,-"x3"]) # now drop the x3 column from the dataset (just for the model)

또는 동일한 단계에서 두 가지를 모두 수행 할 수 있습니다.

lm( y ~ ., dt[x3 == 'men',-"x3"])

전반적으로 이것은 훌륭한 솔루션입니다. 해결하려면 한 가지이다 -x3수식에서 않습니다 하지 원인 lm은 열을 빼기 위해 노력하고 있다고 생각 할 수 있습니다. "모델에 x3을 사용하지 마십시오"의도는 올바르게 전달되지만 문제는 lm호출 model.frame( ..., drop.unused.levels=TRUE )x3단일 레벨 요소가되어에서 다운 스트림 문제가 발생한다는 것입니다 model.matrix().
Artem Sokolov

명확하게 설명해 주셔서 감사합니다 Artem Sokolov, 나는 내 대답에서 그 잘못된 설명을 취했습니다.
Dylan_Gomes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.