Tìm giá trị phù hợp và dự đoán cho mô hình thống kê


12

Giả sử tôi có dữ liệu sau và đang chạy mô hình hồi quy:

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

Một mặt, tôi chạy một mô hình tuyến tính để dự đoán thu nhập:

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

Thứ hai, tôi chạy một mô hình logit để dự đoán về biến won:

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

Đối với cả hai mô hình, tôi tự hỏi làm thế nào tôi có thể tạo bảng hoặc khung dữ liệu với danh mục phản hồi dự đoán, giá trị được trang bị và giá trị dự đoán của mô hình.

Vì vậy, đối với mô hình tuyến tính, một cái gì đó như:

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

Hoặc có lẽ nó nên dành cho từng điểm dữ liệu. Vì vậy, đối với điểm dữ liệu x_i, các giá trị được trang bị và dự đoán là:

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. Từ quan điểm thống kê, một cam kết như vậy có hữu ích không? Tại sao hay tại sao không?

  2. Làm thế nào điều này có thể được thực hiện trong R? (nhìn vào tên (md1) và tìm thấy những gì tôi có thể lấy từ mô hình, nhưng vẫn chưa vượt qua điều đó)

Cảm ơn!


1
Re # 2: stat.ethz.ch/R-manual/R-patched/l Library / stat / html / khăn . Re # 1: hữu ích cho những gì? Bạn muốn đạt được điều gì cuối cùng?
whuber

Hữu ích để biết nếu mô hình là "dự đoán" cho từng điểm dữ liệu riêng lẻ. Tôi muốn xem xét bất kỳ hàng / id nào và có thể so sánh giá trị thật / được trang bị và giá trị dự đoán để xem mức độ "chính xác" của nó.
ATMathew

Nếu bạn muốn quét bảng để xem phản ứng thực tế khác nhau như thế nào đối với hiệp phương sai, tôi cho rằng nó có thể hữu ích. Tôi không hiểu thuật ngữ của bạn mặc dù. giá trị được trang bị và giá trị dự đoán phải giống nhau. Điều khác biệt là giá trị quan sát và giá trị được trang bị.
Michael R. Chernick

2
Có thể thử một cái gì đó như: x = cbind (df, md1 $ lắp.values) colnames (x) = c (colnames (df), "dự đoán")
RioRaider

2
Sự khác biệt giữa các giá trị được quan sát và được trang bị có sẵn thông qua residualslệnh trong R. Sử dụng cbindđể nối chúng với khung dữ liệu gốc.
whuber

Câu trả lời:


20

Bạn phải cẩn thận một chút với các đối tượng mô hình trong R. Ví dụ, trong khi các giá trị được trang bị và dự đoán của dữ liệu huấn luyện phải giống nhau trong glm()trường hợp mô hình, chúng không giống nhau khi bạn sử dụng các hàm trích xuất chính xác:

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

Đó là bởi vì mặc định predict.glm()là để trả về các dự đoán theo tỷ lệ của dự đoán tuyến tính. Để có được các giá trị được trang bị, chúng tôi muốn áp dụng nghịch đảo của hàm liên kết với các giá trị đó. fitted()làm điều đó cho chúng tôi và chúng tôi cũng có thể nhận được các giá trị chính xác bằng cách sử dụng predict():

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

Tương tự như vậy với residuals()(hoặc resid()); các giá trị được lưu trữ trong md2$residualslàm việc dư là không có khả năng là những gì bạn muốn. Các resid()phương pháp cho phép bạn chỉ định các loại hình còn lại mà bạn muốn và có một mặc định hữu ích.

Đối với glm()mô hình, một cái gì đó như thế này sẽ đủ:

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

Một cái gì đó tương tự có thể được thực hiện cho lm()mô hình:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.