73

如果我在迴歸中使用二元解釋變量,我該如何告訴R使用某個級別作爲參考?如何強制R在迴歸中使用指定的因子水平作爲參考?

這只是默認使用一些級別。

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

b {0, 1, 2, 3, 4}。假設我想用3代替R使用的零。

+7

您應該執行模型公式/擬合之外的數據處理步驟。當從「b」創建因子時,可以使用因子(b,levels = c(3,1,2,4,5))'指定等級的順序。儘管在lm()調用之外的數據處理步驟中執行此操作。我在下面的答案中使用了''''''''''''''函數,因此您可以創建一個因子,然後根據需要移動參考級別。 – 2010-10-06 12:14:31

+1

我重新提出了你的問題。你實際上是在改變參考水平之後,而不是離開一個。 – 2010-10-06 12:39:37

+0

thx重新說明我的問題。事實上,我正在尋找的是reavel()。 Thx爲詳細的答案和例子。我不確定線性迴歸標記是否有點誤導,因爲這適用於使用虛擬說明的各種迴歸... – 2010-10-07 08:52:03

回答

105

請參閱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) 

現在,通過使用relevel()功能的改變因素bDF

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 
+2

爲了預先存儲原始變量,只是不要使用'within',而是'df $ bR =紅寶石(df $ b,ref = 3)'。 – BurninLeo 2017-03-16 10:49:52

24

該命令是對你的問題的速記方法。它所做的是重新排序因子,以便首先考慮什麼是參考水平。因此,重新排序因素水平也會產生相同的效果,但會給您更多的控制權。也許你想有3,4,0,1,2等級。在這種情況下...

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

我喜歡這種方法,因爲它更容易對我來說,在我的代碼不僅看到什麼是參考,但其他值的位置以及(而不是看結果)。

注意:不要使它成爲一個有序因子。具有指定順序和有序因子的因素不是同一件事。如果你這樣做,lm()可能開始認爲你需要多項式對比。

+2

多項式對比,而不是多項式迴歸。 – hadley 2010-10-06 13:31:17

+0

有沒有辦法在定義因子的同時設置參考級別,而不是在隨後的調用級別中調用? – 2016-10-18 15:11:22

28

其他人已經提到了如果你想改變你的數據的所有分析的基本級別(或願意隨着數據的改變而生活),那麼最好的解決方案就是最好的解決方案。

如果您不想更改數據(這是一次性更改,但將來您希望再次使用默認行爲),那麼您可以使用C(注意大寫)函數的組合來設置對比和控制處理功能與基本參數一起選擇您想要成爲基線的水平。例如:

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

您也可以手動標記與contrasts屬性,它似乎是由迴歸函數得到尊重列:

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

我知道這是一個老問題,但我有一個類似的問題,並發現:

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

完全是你問。

+0

這是一個很大的幫助!唯一的解決方案包括在lm()命令中執行它的方法,這正是我所需要的。謝謝! – seeellayewhy 2018-01-11 18:20:59