R:限制/设置线性模型的预测结果的值

时间:2015-02-20 16:38:07

标签: r statistics prediction lm predict

R的新人。

希望限制可以预测的值范围。

df.Train <- data.frame(S=c(1,2,2,2,1),L=c(1,2,3,3,1),M=c(400,450,400,700,795),V=c(423,400,555,600,800),G=c(4,3.2,2,2.7,3.4), stringsAsFactors=FALSE)
m.Train <- lm(G~S+L+M+V,data=df.Train)
df.Test <- data.frame(S=c(1,2,1,2,1),L=c(1,2,3,1,1),M=c(400,450,500,800,795),V=c(423,475,555,600,555), stringsAsFactors=FALSE)
round(predict(m.Train, df.Test, type="response"),digits=1)
#seq(0,4,.1) #Predicted values should fall in this range

我已尝试过预测()选项,但没有运气。 预测中有选项吗?我应该在模型中限制它吗?

谢谢

1 个答案:

答案 0 :(得分:2)

在这种情况下,有一些方法可以转换您的响应变量G,但需要有充分的理由这样做。例如,如果您希望输出的概率介于0和1之间,而您的响应变量是二进制(0,1),则需要进行逻辑回归。

这一切都归结为您拥有的数据以及响应变量的模型/转换是否合适。在您的示例中,您没有指定数据是什么,因此我们无法说明要使用哪种模型或哪种转换。

设置上面的内容,如果你真的关心预测并且不关心模型或转换(但你为什么不关心?)看起来你的数据可能会使用quasipossion广义线性模型可能提供您需要的输出:

df.Train <- data.frame(S=c(1,2,2,2,1),L=c(1,2,3,3,1),M=c(400,450,400,700,795),V=c(423,400,555,600,800),G=c(4,3.2,2,2.7,3.4), stringsAsFactors=FALSE)
m.Train <- glm(G~S+L+M+V,data=df.Train, family=quasipoisson)
df.Test <- data.frame(S=c(1,2,1,2,1),L=c(1,2,3,1,1),M=c(400,450,500,800,795),V=c(423,475,555,600,555), stringsAsFactors=FALSE)

> predict(m.Train, df.Test, type="response")
       1        2        3        4        5 
4.000000 2.840834 3.062754 3.615447 4.573276 
#probably not as good as you want

默认情况下,模型使用log链接,以确保值为正值。无法保证模型不会预测大于4的值,但由于您输入的值小于4(您的G变量),因此大多数预测可能会遵循该分布(如本例所示)。然后,您可能需要考虑如何处理高于4的预测。

一般来说,您应该仔细考虑选择哪种模型以及哪种响应转换。例如,上面的毒药模型通常用于计数数据。但是,您永远不应该自己操纵预测,因此如果您最终选择lm模型,请确保使用它给出的预测。

修改

在您的情况下,非线性回归可能就是您所需要的。使用类似lm的线性模型的问题是预测可能大于观察到的病例的最大值并且小于观察到的病例的最小值。在这种情况下,进行线性回归可能不合适。有些算法会从不预测大于最大值或小于最小值的值。这种情况可能更适合您的情况。其中一种算法是k-最近邻居,例如:

library(FNN)
> knn.reg(df.Train[1:4], test=df.Test[1:4], y=df.Train[5], k=3)
Prediction:
[1] 3.066667 3.066667 3.066667 2.700000 3.100000

正如您所看到的,预测永远不会超过4.那就是说knn是一种局部求解算法,所以你需要再次研究这对你的问题和数据是否是一个好的方法。在预测方面,它确实证实了你的条件。 Knn是一种非常容易理解的算法,它依赖于点之间的距离来计算预测。

希望有所帮助:)