2017-01-30 97 views
1

據我所知,當您使用名義預測變量來擬合R中的線性模型時,R實質上會爲每個級別(除參考級別之外)使用虛擬1/0變量,然後爲這些變量中的每一個給定一個固定的舊係數。它對序數預測值有什麼作用?它給了我每個級別的估計係數,所以它不僅僅將這些級別當作數值預測器。我如何正確解釋這樣的輸出?R如何處理lm()中的序數預測變量?

cars.data <- mtcars[,1:3] 
cars.data$cyl.ord <- ordered(cars.data$cyl) 
lm(mpg ~ disp + cyl.ord, data = cars.data) 
Call: 
lm(formula = mpg ~ disp + cyl.ord) 

Coefficients: 
(Intercept)   disp cyl.ord.L cyl.ord.Q 
    26.34212  -0.02731  -3.38852  1.95127 

我原本以爲我可以利用係數從序變量以同樣的方式我想如果它是一個無序的分類,但predict.lm(ord.model, newdata = data.frame("disp" = 150, "cyl.ord" = "6"))給人20.65263,而26.34212378 -0.02730864*150 -3.38851642只給出了18.85731,所以不能這樣。 (我試着用+1.95127和+0代替-3.38852,以防我混淆了他們列出的順序,但沒有骰子。)我在線上找不到order()lm()的文檔中的任何內容,或者在我的任何書中。

R如何在數學上處理序數預測因子,我應該如何處理輸出?

回答

2

看來,轉化因子變量爲序因子變量的變化從「contr.treatment」默認對比度爲「contr.poly」

# make cyl a factor 
cars.data$cyl <- factor(cars.data$cyl) 

現在考慮的lm輸出與「對照。治療」和‘contr.poly’

lm(mpg ~ disp + cyl.ord, data=cars.data) 

Call: 
lm(formula = mpg ~ disp + cyl.ord, data = cars.data) 

Coefficients: 
(Intercept)   disp cyl.ord.L cyl.ord.Q 
    26.34212  -0.02731  -3.38852  1.95127 

lm(mpg ~ disp + cyl, data=cars.data, 
    contrasts=list(cyl="contr.poly")) 

Call: 
lm(formula = mpg ~ disp + cyl, data = cars.data, 
    contrasts=list(cyl = "contr.poly")) 

Coefficients: 
(Intercept)   disp  cyl.L  cyl.Q 
    26.34212  -0.02731  -3.38852  1.95127 

索爾有序因子用‘contr.poly’作爲默認的對比,我們可以從一個無序因素相同的結果。現在,考慮無序因素。

lm(mpg ~ disp + cyl, data=cars.data) 

Call: 
lm(formula = mpg ~ disp + cyl, data = cars.data) 

Coefficients: 
(Intercept)   disp   cyl6   cyl8 
    29.53477  -0.02731  -4.78585  -4.79209 

lm(mpg ~ disp + cyl.ord, data=cars.data, contrasts=list(cyl.ord="contr.treatment")) 

Call: 
lm(formula = mpg ~ disp + cyl.ord, data = cars.data, 
    contrasts=list(cyl.ord="contr.treatment")) 

Coefficients: 
(Intercept)   disp  cyl.ord6  cyl.ord8 
    29.53477  -0.02731  -4.78585  -4.79209 

所以,無序因子變量默認使用「contr.treatment」,我們可以通過明確地要求得到它從一個有序因素相同的結果。

但讓我們仔細看看回歸中使用的模型矩陣。

# Show model matrix 
model.matrix(mpg ~ disp + cyl, data=cars.data) 
        (Intercept) disp cyl6 cyl8 
Mazda RX4      1 160.0 1 0 
Mazda RX4 Wag     1 160.0 1 0 
Datsun 710     1 108.0 0 0 
... 
attr(,"assign") 
[1] 0 1 2 2 
attr(,"contrasts") 
attr(,"contrasts")$cyl 
[1] "contr.treatment" 

現在,使用 「contr.poly」 對比度

model.matrix(mpg ~ disp + cyl, data=cars.data, contrasts.arg=list(cyl="contr.poly")) 
        (Intercept) disp   cyl.L  cyl.Q 
Mazda RX4      1 160.0 -9.073800e-17 -0.8164966 
Mazda RX4 Wag     1 160.0 -9.073800e-17 -0.8164966 
Datsun 710     1 108.0 -7.071068e-01 0.4082483 
... 
attr(,"assign") 
[1] 0 1 2 2 
attr(,"contrasts") 
attr(,"contrasts")$cyl 
[1] "contr.poly" 

接着,檢查出cyl.ord代替缸

model.matrix(mpg ~ disp + cyl.ord, data=cars.data) 
        (Intercept) disp  cyl.ord.L cyl.ord.Q 
Mazda RX4      1 160.0 -9.073800e-17 -0.8164966 
Mazda RX4 Wag     1 160.0 -9.073800e-17 -0.8164966 
Datsun 710     1 108.0 -7.071068e-01 0.4082483 
... 
attr(,"assign") 
[1] 0 1 2 2 
attr(,"contrasts") 
attr(,"contrasts")$cyl.ord 
[1] "contr.poly" 

最後兩個矩陣具有相同的條目,所以使用「contr.poly」似乎解釋了最初的差異。要了解有關對比度的更多信息,可以查看?contrasts

+1

現在我發現我不瞭解對比,但這是一個不同的問題(可能更適合CV)。謝謝! – MissMonicaE