R: Limit/Set 线性模型预测结果的值
R: Limit/Set values of predicted results from linear model
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
我尝试过 predict() 选项,但没有成功。
预测中有选项吗?我应该在模型中限制它吗?
谢谢
有多种方法可以转换您的响应变量,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
link 以确保值为正。无法保证模型不会预测大于 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 是一种非常容易理解的算法,它依靠点之间的距离来计算预测。
希望对您有所帮助:)
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
我尝试过 predict() 选项,但没有成功。 预测中有选项吗?我应该在模型中限制它吗?
谢谢
有多种方法可以转换您的响应变量,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
link 以确保值为正。无法保证模型不会预测大于 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 是一种非常容易理解的算法,它依靠点之间的距离来计算预测。
希望对您有所帮助:)