Menemukan nilai yang dipasang dan diprediksi untuk model statistik


12

Katakanlah saya memiliki data berikut dan saya menjalankan model regresi:

df=data.frame(income=c(5,3,47,8,6,5),
              won=c(0,0,1,1,1,0),
              age=c(18,18,23,50,19,39),
              home=c(0,0,1,0,0,1))

Di satu sisi, saya menjalankan model linier untuk memprediksi pendapatan:

md1 = lm(income ~ age + home + home, data=df)

Kedua, saya menjalankan model logit untuk memprediksi variabel yang dimenangkan:

md2 = glm(factor(won) ~ age + home, data=df, family=binomial(link="logit"))

Untuk kedua model, saya bertanya-tanya bagaimana saya bisa menghasilkan tabel atau bingkai data dengan kategori respons prediktor, nilai pas, dan nilai prediksi model.

Jadi untuk model linier, sesuatu seperti:

age  fitted_income  predicted_income
18    3              5 
23    3              3
50    4              2
19    5              5
39    6              4

home   fitted_income    predicted_income
0       5               6       
1       3               9

Atau mungkin harus untuk setiap titik data. Jadi untuk titik data x_i, nilai yang dipasang dan diprediksi adalah:

id   age  fitted_income  predicted_income
1     18    3              5 
2     23    3              3
3     50    4              2
4     19    5              5
5     39    6              4
  1. Dari sudut pandang statistik, apakah usaha semacam itu berguna? Mengapa atau mengapa tidak?

  2. Bagaimana ini bisa dilakukan dalam R? (melihat nama-nama (md1) dan menemukan apa yang dapat saya tarik dari model, tetapi belum melanjutkannya)

Terima kasih!


1
Re # 2: stat.ethz.ch/R-manual/R-patched/library/stats/html/… . Re # 1: berguna untuk apa? Apa yang ingin Anda capai pada akhirnya?
whuber

Berguna untuk mengetahui apakah model tersebut "prediktif" untuk setiap titik data individual. Saya ingin melihat setiap baris / id, dan dapat membandingkan nilai true / fitting dan nilai prediksi untuk melihat seberapa "benar" itu.
ATMathew

Jika Anda ingin memindai tabel untuk melihat bagaimana respons aktual bervariasi sehubungan dengan kovariat, saya kira itu bisa berguna. Saya tidak mengerti terminologi Anda. nilai pas dan nilai prediksi harus sama. Apa yang harus berbeda adalah nilai yang diamati dan nilai yang dipasang.
Michael R. Chernick

2
Dapat mencoba sesuatu seperti: x = cbind (df, md1 $ fitting.values) colnames (x) = c (colnames (df), "diprediksi")
RioRaider

2
Perbedaan antara nilai-nilai yang diamati dan dipasang tersedia melalui residualsperintah di R. Gunakan cbinduntuk bergabung dengan mereka ke kerangka data asli.
whuber

Jawaban:


20

Anda harus sedikit berhati-hati dengan objek model di R. Misalnya, sementara nilai yang dipasang dan prediksi data pelatihan harus sama dalam glm()kasus model, mereka tidak sama ketika Anda menggunakan fungsi ekstraktor yang benar:

R> fitted(md2)
        1         2         3         4         5         6 
0.4208590 0.4208590 0.4193888 0.7274819 0.4308001 0.5806112 
R> predict(md2)
         1          2          3          4          5          6 
-0.3192480 -0.3192480 -0.3252830  0.9818840 -0.2785876  0.3252830

Itu karena default untuk predict.glm()mengembalikan prediksi pada skala prediktor linier. Untuk mendapatkan nilai yang pas, kami ingin menerapkan kebalikan dari fungsi tautan ke nilai-nilai itu. fitted()apakah itu bagi kami, dan kami juga bisa mendapatkan nilai yang benar menggunakan predict():

R> predict(md2, type = "response")
        1         2         3         4         5         6 
0.4208590 0.4208590 0.4193888 0.7274819 0.4308001 0.5806112

Begitu juga dengan residuals()(atau resid()); nilai-nilai yang disimpan md2$residualsadalah residual yang bekerja tidak seperti yang Anda inginkan. The resid()Metode ini memungkinkan Anda untuk menentukan jenis residual yang Anda inginkan dan memiliki standar yang berguna.

Untuk glm()model, sesuatu seperti ini sudah cukup:

R> data.frame(Age = df$age, Won = df$won, Fitted = fitted(md2))
  Age Won    Fitted
1  18   0 0.4208590
2  18   0 0.4208590
3  23   1 0.4193888
4  50   1 0.7274819
5  19   1 0.4308001
6  39   0 0.5806112

Hal serupa dapat dilakukan untuk lm()model:

R> data.frame(Age = df$age, Income = df$income, Fitted = fitted(md1))
  Age Income    Fitted
1  18      5  7.893273
2  18      3  7.893273
3  23     47 28.320749
4  50      8 -1.389725
5  19      6  7.603179
6  39      5 23.679251
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.