Menafsirkan koefisien dalam model regresi linier dengan variabel kategori

8

Saya akan memberikan contoh saya dengan panggilan R. Pertama, contoh sederhana dari regresi linier dengan variabel 'masa hidup', dan dua variabel penjelas kontinu.

data.frame(height=runif(4000,160,200))->human.life
human.life$weight=runif(4000,50,120)
human.life$lifespan=sample(45:90,4000,replace=TRUE)
summary(lm(lifespan~1+height+weight,data=human.life))

Call:
lm(formula = lifespan ~ 1 + height + weight, data = human.life)

Residuals:
Min       1Q   Median       3Q      Max 
-23.0257 -11.9124  -0.0565  11.3755  23.8591 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 63.635709   3.486426  18.252   <2e-16 ***
height       0.007485   0.018665   0.401   0.6884    
weight       0.024544   0.010428   2.354   0.0186 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Residual standard error: 13.41 on 3997 degrees of freedom
Multiple R-squared: 0.001425,   Adjusted R-squared: 0.0009257 
F-statistic: 2.853 on 2 and 3997 DF,  p-value: 0.05781

Untuk menemukan perkiraan 'masa hidup' ketika nilai 'berat' adalah 1, saya tambahkan (intersepsi) + tinggi = 63.64319

Sekarang bagaimana jika saya memiliki kerangka data yang serupa, tetapi di mana salah satu variabel penjelas adalah kategorikal?

data.frame(animal=rep(c("dog","fox","pig","wolf"),1000))->animal.life
animal.life$weight=runif(4000,8,50)
animal.life$lifespan=sample(1:10,replace=TRUE)
summary(lm(lifespan~1+animal+weight,data=animal.life))

Call:
lm(formula = lifespan ~ 1 + animal + weight, data = animal.life)

Residuals:
Min      1Q  Median      3Q     Max 
-4.7677 -2.7796 -0.1025  3.1972  4.3691 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 5.565556   0.145851  38.159  < 2e-16 ***
animalfox   0.806634   0.131198   6.148  8.6e-10 ***
animalpig   0.010635   0.131259   0.081   0.9354    
animalwolf  0.806650   0.131198   6.148  8.6e-10 ***
weight      0.007946   0.003815   2.083   0.0373 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Residual standard error: 2.933 on 3995 degrees of freedom
Multiple R-squared: 0.01933,    Adjusted R-squared: 0.01835 
F-statistic: 19.69 on 4 and 3995 DF,  p-value: 4.625e-16

Dalam hal ini, untuk menemukan perkiraan 'rentang hidup' ketika nilai 'berat' adalah 1, haruskah saya menambahkan masing-masing koefisien untuk 'hewan' ke intersep: (Intercept) + animalfox + animalpig + animalwolf? Atau apa cara yang tepat untuk melakukan ini?

Terima kasih Sverre

Sverre
sumber
tanda-tanda dolar membuat Anda memasuki lingkungan persamaan dan itulah sebabnya semuanya secara miring dicetak miring.
Makro
format: untuk mendapatkan code, indentasi oleh 4 spasi.
wolf.rauch
jika Anda menggunakan 4 spasi indentasi, Anda dapat menempatkan tanda bintang dan dolar di sana dan mereka akan muncul seperti itu. jika Anda menggunakannya di luar pemformatan kode, mereka akan diperlakukan seperti markup. Jika Anda tidak menginginkan saluran lengkap code, gunakan backticks:this is code with a $ and *
wolf.rauch
1
Adalah baik bahwa Anda telah menggunakan contoh yang dapat direproduksi. Anda dapat membuat contoh lebih baik dengan memasukkan set.seed(1)(atau nomor apa pun yang Anda suka) sebelum menjalankan pembuatan bilangan acak, sehingga semua orang mendapatkan hasil yang persis sama dengan Anda (meskipun tidak terlalu berarti dalam hal ini).
wolf.rauch
Hanya dua komentar kecil. Anda menulis "Untuk menemukan perkiraan 'masa hidup' ketika nilai 'berat' adalah 1, saya menambahkan (Intercept) + tinggi = 63.64319". Perhatikan bahwa ini adalah perkiraan umur rata-rata ketika berat = 1 dan tinggi = 0 . Itu mungkin tidak terlalu berarti. Juga, prediksi di luar kisaran nilai yang diamati dari variabel independen perlu diperlakukan dengan hati-hati (berat adalah antara 50 dan 120, sehingga berat = 1 juga tidak terlalu berarti). Hanya beberapa catatan dan mungkin hal-hal yang sudah Anda ketahui. Tapi untuk jaga-jaga ...
Wolfgang

Jawaban:

12

Tidak, Anda tidak harus menambahkan semua koefisien secara bersamaan. Anda pada dasarnya memiliki model

lifespan=β0+β1fox+β2pig+β3wolf+β4weight+ε

di mana, misalnya, jika hewan itu babi dan 0 sebaliknya. Jadi, untuk menghitung seperti yang Anda sarankan untuk mendapatkan rata-rata keseluruhan ketika seperti mengatakan "jika Anda adalah babi, serigala, dan rubah, dan berat badan Anda adalah 1, berapa umur yang Anda harapkan?". Jelas karena setiap hewan hanyalah salah satu dari hal-hal itu, itu tidak masuk akal.pig=1β0+β1+β2+β3+β4weight=1

Anda harus melakukan ini secara terpisah untuk setiap hewan. Misalnya, adalah umur yang diharapkan untuk babi ketika beratnya 1.β0+β2+β4

Makro
sumber
Makro: Saya mengerti. Apakah masuk akal, kemudian, untuk menemukan koefisien rata-rata untuk level pada 'hewan'? Dengan kata lain do (Intercept) + (animalfox + animalpig + animalwolf) / 3. Atau apakah itu valid hanya jika ada jumlah pengamatan yang sama untuk setiap hewan dalam kumpulan data?
Sverre
Saya pikir Anda benar - itu hanya akan valid jika ada jumlah yang sama di setiap grup. Anda dapat menimbang mereka sebanding dengan seberapa berat masing-masing kelompok diwakili dalam sampel jika Anda bersikeras meringkasnya menjadi satu nomor.
Makro
Apa cara yang tepat untuk menimbang mereka? Alasan saya "bersikeras" merangkumnya menjadi satu angka adalah karena saya ingin menggambar garis regresi hanya untuk satu variabel pada plot pencar. Misalnya, dalam contoh human.life di atas, saya akan menggambar garis regresi untuk 'berat' dengan menentukan intersep garis ((Intercept) + tinggi = 63.64319) dengan koefisiennya (0,024544). Itu hanya sedikit rumit dalam kasus animal.life.
Sverre
Berpikir lebih banyak tentang itu, saya tidak tahu bagaimana jenis rata-rata bisa ditafsirkan. Anda hanya bisa menggambar tiga garis regresi paralel pada satu plot bukan? Juga, bagi saya tampaknya efek "berat" akan berbeda untuk setiap hewan, dalam hal ini Anda harus memiliki hewan yang berinteraksi dengan berat, yang akan mengarah pada tiga garis regresi yang sama sekali berbeda untuk setiap hewan.
Makro
Tetapi dalam kasus di mana variabel untuk 'hewan' dan variabel untuk 'berat' keduanya signifikan, tetapi interaksi mereka tidak, saya bahkan tidak akan memasukkan interaksi dalam model. Regresi berganda memperkirakan efek 'berat' terlepas dari apa nilai 'hewan'.
Sverre
4

Hal paling sederhana yang harus dilakukan adalah menggunakan fungsi prediksi pada objek lm, lalu mengurus banyak detail seperti mengubah faktor ke nilai yang tepat untuk ditambahkan bersama. Jika Anda mencoba untuk memahami bagian-bagian yang masuk ke dalam prediksi maka atur type='terms'dan itu akan menunjukkan masing-masing bagian yang ditambahkan bersama membuat prediksi Anda.

Perhatikan juga bahwa bagaimana suatu faktor dikonversi ke variabel tergantung pada beberapa opsi, defaultnya akan memilih kelompok dasar untuk membandingkan kelompok lain, tetapi Anda juga dapat mengaturnya menjadi rata-rata dan perbedaan dari rata-rata itu (atau perbandingan minat lainnya) .

Greg Snow
sumber
Menggunakan predict.lm () adalah solusi yang bagus untuk objek lm. Sayangnya, saya benar-benar pas objek lmer ke data saya, yang tidak ada fungsi predict () mengekstraksi istilah individual. Apakah saya mengerti Anda dengan benar bahwa metode alternatif yang Anda sarankan akan menetapkan intersep menjadi nilai rata-rata, bukan garis dasar (di mana semua prediktor kontinu ditetapkan ke 0, dan satu nilai prediktor kategorik dipilih)? Jika demikian, saya ingin tahu bagaimana melakukannya. Kemudian saya bisa menggambar garis regresi saya sebagai intersepsi model + koefisien prediktor saya.
Sverre
Lihatlah "kontras," C, "contr.sum, dan bagian kontras dari" opsi.
Greg Snow
2

Jika Anda ingin umur rata-rata saat berat badan adalah 1 maka Anda bisa menghilangkan "hewan" dalam panggilan ini:

lm(formula = lifespan ~ 1 + animal + weight, data = animal.life)
Peter Flom
sumber
Saya tidak mengerti bagaimana ini bisa benar. Jika saya mengambil salah satu prediktor ('hewan'), maka intersepsi, koefisien 'berat', dan kesalahan memperkirakan semua perubahan. Juga, saya tidak mencoba mencari tahu berapa umur rata - rata aktual untuk berat 1 dalam data, hanya seperti yang diprediksi oleh model.
Sverre