R이 회귀에서 참조로 지정된 요인 수준을 사용하도록 강제하는 방법은 무엇입니까?


112

회귀에서 이진 설명 변수를 사용하는 경우 R에게 특정 수준을 참조로 사용하도록하려면 어떻게해야합니까?

기본적으로 일정 수준을 사용하고 있습니다.

lm(x ~ y + as.factor(b)) 

와 함께 b {0, 1, 2, 3, 4}. R에서 사용하는 0 대신 3을 사용하고 싶다고 가정 해 보겠습니다.


9
모델 공식 / 피팅 외부에서 데이터 처리 단계를 수행해야합니다. 에서 요인을 생성 할 때를 b사용하여 수준의 순서를 지정할 수 있습니다 factor(b, levels = c(3,1,2,4,5)). lm()그러나 호출 외부의 데이터 처리 단계에서이 작업을 수행하십시오 . 아래의 내 대답은 relevel()함수를 사용 하므로 요인을 만든 다음 필요에 따라 참조 수준을 이동할 수 있습니다.
Gavin Simpson

1
나는 당신의 질문을 바 꾸었습니다. 당신은 실제로 참조 레벨을 변경 한 후입니다.
Joris Meys

내 질문을 바꾸어 주셔서 감사합니다. 실제로 relevel ()은 내가 찾던 것이었다. 자세한 답변과 예는 Thx입니다. 나는 확실하지 선형 회귀 태그는 더미 explanatories를 사용하여 회귀의 모든 종류에 적용되기 때문에 오해의 소지가 조금 인 경우 ...
매트 Bannert

답변:


152

relevel()기능을 참조하십시오 . 다음은 예입니다.

set.seed(123)
x <- rnorm(100)
DF <- data.frame(x = x,
                 y = 4 + (1.5*x) + rnorm(100, sd = 2),
                 b = gl(5, 20))
head(DF)
str(DF)

m1 <- lm(y ~ x + b, data = DF)
summary(m1)

이제 함수 를 사용 하여 요소 b를 변경합니다 .DFrelevel()

DF <- within(DF, b <- relevel(b, ref = 3))
m2 <- lm(y ~ x + b, data = DF)
summary(m2)

모델은 서로 다른 참조 수준을 추정했습니다.

> coef(m1)
(Intercept)           x          b2          b3          b4          b5 
  3.2903239   1.4358520   0.6296896   0.3698343   1.0357633   0.4666219 
> coef(m2)
(Intercept)           x          b1          b2          b4          b5 
 3.66015826  1.43585196 -0.36983433  0.25985529  0.66592898  0.09678759

9
원래 변수를 유지하려면 within,하지만 df$bR = relevel(df$b, ref=3).
BurninLeo

1
공식 내에서 relevel ()을 사용할 수 있습니다. 원래 데이터 세트에는 영향을주지 않습니다 ...
Mehdi Zare

36

다른 사람들은 relevel데이터에 대한 모든 분석의 기본 수준을 변경하려는 경우 (또는 데이터 변경에 기꺼이 살고있는 경우) 최상의 솔루션 인 명령을 언급했습니다 .

데이터를 변경하지 않으려면 (한 번만 변경되지만 나중에 기본 동작을 다시 원할 경우) C(대문자 참고) 함수 의 조합을 사용하여 대비를 설정 contr.treatments하고 기준이 될 레벨을 선택하기위한 기본 인수입니다.

예를 들면 :

lm( Sepal.Width ~ C(Species,contr.treatment(3, base=2)), data=iris )

33

relevel()명령은 질문에 대한 간단한 방법입니다. 그것이하는 일은 요소를 재정렬하여 참조 수준이 무엇이든 먼저되도록하는 것입니다. 따라서 요인 수준을 재정렬하는 것도 효과는 같지만 더 많은 제어를 제공합니다. 레벨 3,4,0,1,2를 원했을 것입니다. 그렇다면 ...

bFactor <- factor(b, levels = c(3,4,0,1,2))

이 방법을 선호하는 이유는 내 코드에서 참조가 무엇인지뿐만 아니라 다른 값의 위치도 (그 결과를 볼 필요없이) 쉽게 볼 수 있기 때문입니다.

참고 : 주문 요소로 만들지 마십시오. 순서가 지정된 요인과 순서가 지정된 요인은 동일하지 않습니다. lm()그렇게하면 다항식 대비를 원한다고 생각할 수 있습니다.


2
다항식 회귀가 아닌 다항식 대비.
hadley

레벨을 다시 조정하기위한 후속 호출에서가 아니라 요인을 정의하는 동시에 참조 레벨을 설정하는 방법이 있습니까?
David Bruce Borenstein

31

나는 이것이 오래된 질문이라는 것을 알고 있지만 비슷한 문제가 있었고 다음을 발견했습니다.

lm(x ~ y + relevel(b, ref = "3")) 

당신이 요청한 것을 정확하게 수행합니다.


3
이것은 큰 도움이되었습니다! 정확히 내가 필요한 lm () 명령 내에서 수행하는 방법을 포함하는 유일한 솔루션입니다. 감사!
cparmstrong

3
이것은 요인을 다루는 매우 유연한 방법입니다. as.factor()예를 들어 다음을 사용하여 필요한 경우 결합 할 수 있다는 사실이 마음에 ...+relevel(as.factor(mycol), ref = "myref")+...
Peter

12

contrasts회귀 함수에서 존중하는 것처럼 보이는 속성으로 열에 수동으로 태그를 지정할 수도 있습니다 .

contrasts(df$factorcol) <- contr.treatment(levels(df$factorcol),
   base=which(levels(df$factorcol) == 'RefLevel'))

1

dplyr / tidyverse 버전을 찾는 사람들을 위해. Gavin Simpson 솔루션 구축 :

# Create DF
set.seed(123)
x <- rnorm(100)
DF <- data.frame(x = x,
                 y = 4 + (1.5*x) + rnorm(100, sd = 2),
                 b = gl(5, 20))

# Change reference level
DF = DF %>% mutate(b = relevel(b, 3))

m2 <- lm(y ~ x + b, data = DF)
summary(m2)

당신은 당신이 한 곳에 ...이 사용 여부를 필요가있다 "변수가 요인이"넣어 내가 왜 혼란스러워하고있어 relevel()forcats::fct_relevel()
그레고르 토마스

당신이 맞습니다, 감사합니다! afaik, fct_relevel은 요인으로 만 작동하기 때문에 "사용할 수도 있습니다"라고 추가했습니다.
Gorka

2
relevel요인에 대해서만 작동합니다. fct_relevel요인에 대해서만 작동합니다. 이름 AFAIK를 제외하고는 함수간에 차이가 없습니다. "변수가 요인 인 경우에도 사용할 수 있습니다. fct_relevel"라는 것은 변수가 요인아닌 경우 사용할 수 relevel있지만 사실이 아님을 의미합니다.
Gregor Thomas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.