Jak zmusić R do użycia określonego poziomu czynnika jako odniesienia w regresji?

Jak mogę powiedzieć R, aby używał określonego poziomu jako odniesienia, jeśli używam binarnych zmiennych objaśniających w regresji?

Domyślnie używa jakiegoś poziomu.

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

Z b {0, 1, 2, 3, 4}. Załóżmy, że chcę użyć 3 zamiast zera, które jest używane przez R.

Author: An economist, 2010-10-06

5 answers

Patrz Funkcja relevel(). Oto przykład:

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)

Teraz zmień współczynnik b w DF za pomocą funkcji relevel():

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

Modele oszacowały różne poziomy odniesienia.

> 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
 120
Author: Gavin Simpson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-06 12:05:52

Inni wspominali o komendzie relevel, która jest najlepszym rozwiązaniem, jeśli chcesz zmienić poziom bazowy dla wszystkich analiz na swoich danych (lub chcesz żyć ze zmianą danych).

Jeśli nie chcesz zmieniać danych (jest to zmiana jednorazowa, ale w przyszłości chcesz ponownie domyślnego zachowania), możesz użyć kombinacji funkcji C (Uwaga wielkie litery) do ustawiania kontrastów i contr.funkcje zabiegów z argumentem podstawowym do wyboru, który poziom chcesz być punktem odniesienia. Na przykład:

lm( Sepal.Width ~ C(Species,contr.treatment(3, base=2)), data=iris )
 32
Author: Greg Snow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-06 15:24:55

Polecenie relevel() jest metodą skróconą do twojego pytania. To, co robi, to zmiana kolejności czynnika tak, że niezależnie od poziomu ref jest pierwszy. Dlatego zmiana kolejności poziomów czynnika również będzie miała ten sam efekt, ale daje większą kontrolę. Być może chciałeś mieć poziomy 3,4,0,1,2. W takim razie...

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

Wolę tę metodę, ponieważ łatwiej jest mi zobaczyć w moim kodzie nie tylko to, co było odniesieniem, ale także pozycję innych wartości (zamiast szukać na wyniki za to).

Uwaga: nie rób z tego czynnika uporządkowanego. Czynnik o określonym porządku i czynnik uporządkowany to nie to samo. lm() może zacząć myśleć, że chcesz kontrasty wielomianowe, jeśli to zrobisz.

 25
Author: John,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-17 19:16:00

Wiem, że to stare pytanie, ale miałem podobny problem i stwierdziłem, że:

lm(x ~ y + relevel(b, ref = "3")) 
Robi dokładnie to, o co prosiłeś.
 15
Author: Yan Alperovych,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-14 14:27:23

Możesz również ręcznie oznaczyć kolumnę atrybutem contrasts, który wydaje się być respektowany przez funkcje regresji:

contrasts(df$factorcol) <- contr.treatment(levels(df$factorcol),
   base=which(levels(df$factorcol) == 'RefLevel'))
 11
Author: Harlan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-06 15:25:15