R'yi bir regresyonda referans olarak belirli bir faktör seviyesini kullanmaya nasıl zorlayabilirim?


112

Bir regresyonda ikili açıklayıcı değişkenler kullanırsam, R'ye belirli bir seviyeyi referans olarak kullanmasını nasıl söyleyebilirim?

Varsayılan olarak sadece bir seviye kullanıyor.

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

ile b {0, 1, 2, 3, 4}. Diyelim ki R tarafından kullanılan sıfır yerine 3 kullanmak istiyorum.


9
Veri işleme adımını model formülünün / uydurmanın dışında yapmalısınız. Faktörü oluştururken bkullanarak seviyelerin sırasını belirleyebilirsiniz factor(b, levels = c(3,1,2,4,5)). Bunu, lm()aramanın dışındaki bir veri işleme adımında yapın . Aşağıdaki cevabım relevel()işlevi kullanır, böylece bir faktör oluşturabilir ve ardından referans seviyesini ihtiyaç duyduğunuza uyacak şekilde kaydırabilirsiniz.
Gavin Simpson

1
Sorunuzu değiştirdim. Aslında referans seviyesini değiştirdikten sonra, birini atlamazsınız.
Joris Meys

sorumu yeniden ifade ettiğiniz için teşekkürler. Gerçekten de aradığım şey relevel () idi. Ayrıntılı cevap ve örnek için Thx. Doğrusal regresyon etiketinin biraz yanıltıcı olup olmadığından emin değilim çünkü bu, kukla açıklamalar kullanan her tür regresyon için geçerli ...
Matt Bannert

Yanıtlar:


152

İşleve bakın relevel(). İşte bir örnek:

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)

Şimdi faktörünü değiştirmek biçinde DFkullanımıyla relevel()fonksiyonu:

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

Modeller farklı referans seviyelerini tahmin etmiştir.

> 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
Orijinal değişkeni korumak için, sadece within, ama df$bR = relevel(df$b, ref=3).
BurninLeo

1
Formülünüzde relevel () kullanabilirsiniz, orijinal veri kümesini etkilemez ...
Mehdi Zare

36

Diğerleri relevel, verilerinizdeki tüm analizler için temel düzeyi değiştirmek istiyorsanız (veya verileri değiştirerek yaşamaya istekliyseniz) en iyi çözüm olan komuttan bahsetmişlerdir .

Verileri değiştirmek istemiyorsanız (bu tek seferlik bir değişikliktir, ancak gelecekte varsayılan davranışı tekrar istiyorsanız), Ckontrastları ayarlamak için (büyük harf notu) işlevinin bir kombinasyonunu ve ile contr.treatmentsişlevi kullanabilirsiniz. temel olmasını istediğiniz seviyeyi seçmek için temel bağımsız değişken.

Örneğin:

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

33

relevel()Komut sorunuza kısayol yöntemidir. Yaptığı şey faktörü yeniden sıralamaktır, böylece ref seviyesi ne olursa olsun önce olur. Bu nedenle, faktör seviyelerinizi yeniden düzenlemek de aynı etkiye sahip olacak, ancak size daha fazla kontrol sağlayacaktır. Belki 3,4,0,1,2 seviyelerine sahip olmak istediniz. Bu durumda...

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

Bu yöntemi tercih ediyorum çünkü kodumda yalnızca referansın ne olduğunu değil, diğer değerlerin konumunu da (bunun sonuçlarına bakmak yerine) görmek benim için daha kolay.

NOT: Bunu sıralı bir faktör YAPMAYIN. Belirli bir sıraya sahip bir faktör ve sıralı bir faktör aynı şey değildir. lm()Bunu yaparsanız polinom zıtlıkları istediğinizi düşünmeye başlayabilirsiniz.


2
Polinom zıtlıkları, bir polinom gerilemesi değil.
hadley

Referans düzeyini, sonraki bir yeniden seviyelendirme çağrısı yerine, faktörü tanımladığınız anda belirlemenin bir yolu var mı?
David Bruce Borenstein

31

Bunun eski bir soru olduğunu biliyorum, ancak benzer bir sorunla karşılaştım ve şunu buldum:

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

tam olarak istediğini yapıyor.


3
Bu çok yardımcı oldu! Bunu yapmanın bir yolunu lm () komutu içinde içeren tek çözüm, tam da ihtiyacım olan buydu. Teşekkürler!
cparmstrong

3
Bu, faktörlerle çalışmanın çok esnek bir yoludur. as.factor()Gerekirse onu birleştirebileceğim gerçeğini seviyorum, örneğin...+relevel(as.factor(mycol), ref = "myref")+...
Peter

12

Ayrıca contrasts, regresyon işlevleri tarafından saygı duyulduğu görülen bir öznitelikle sütunu manuel olarak da etiketleyebilirsiniz :

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

1

Dplyr / tidyverse versiyon arayanlar için. Gavin Simpson çözümüne dayalı olarak:

# 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)

Yaptığınız yere neden "Değişken bir faktörse" ifadesini koyduğunuzda kafam karıştı ... ister kullansanız relevel()da bu gereklidirforcats::fct_relevel()
Gregor Thomas

Haklısın teşekkürler "Siz de kullanabilirsiniz" i ekledim, çünkü afaik, fct_relevel yalnızca faktörlerle çalışır.
Gorka

2
relevelyalnızca faktörlerle çalışır. fct_relevelyalnızca faktörlerle çalışır. AFAIK adı dışında fonksiyonlar arasında bir fark yoktur. "Değişken de kullanabileceğiniz bir faktör ise söyleyerek fct_relevel" değişken ise ima bir faktör değildir kullanabilirdin relevel, ama bu doğru değildir.
Gregor Thomas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.