查找统计模型的拟合值和预测值


12

假设我有以下数据并且正在运行回归模型:

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

一方面,我运行一个线性模型来预测收入:

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

其次,我运行一个logit模型来预测won变量:

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

对于这两个模型,我想知道如何生成具有预测器响应类别,拟合值和模型预测值的表或数据框。

因此对于线性模型,类似于:

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

也许应该针对每个数据点。因此,对于x_i数据点,拟合值和预测值是:

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. 从统计的角度来看,这样的工作有用吗?为什么或者为什么不?

  2. 如何在R中完成此操作?(看了一下names(md1),发现我可以从模型中获取什么,但是还没有继续下去)

谢谢!


1
RE#2:stat.ethz.ch/R-manual/R-patched/library/stats/html/...。关于#1:对什么有用?您到底想完成什么?
ub

有助于判断模型对于每个单独的数据点是否“可预测”。我想查看任何行/ ID,并且能够比较真实/拟合值和预测值,以了解其“正确性”。
ATMathew '08

如果您想扫描表格以查看实际响应相对于协变量的变化,我想它可能会很有用。我不明白您的用语。拟合值和预测值应相同。观察值和拟合值应该不同。
Michael R. Chernick

2
可以尝试以下方法:x = cbind(df,md1 $ fitted.values)colnames(x)= c(colnames(df),“预测”)
RioRaider 2012年

2
观察并拟合值之间的差异可以通过residuals命令R。用于cbind将它们连接到原始数据框。
ub

Answers:


20

您必须对R中的模型对象有所注意。例如,虽然拟合值和训练数据的预测在glm()模型情况下应该相同,但在使用正确的提取器功能时它们并不相同:

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

这是因为默认值predict.glm()是返回线性预测器范围内的预测。为了获得拟合值,我们想将链接函数的逆值应用于这些值。fitted()为我们做到了这一点,我们还可以使用来获取正确的值predict()

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

同样与residuals()(或resid()); 存储在值md2$residuals工作残差不太可能是你想要的。该resid()方法允许您指定所需残差的类型,并具有有用的默认值。

对于glm()模型,这样的事情就足够了:

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

可以对lm()模型执行类似的操作:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.