首先,我将给你一些入门代码。
library(ggplot2)
y = c(0, 0, 1, 2, 0, 0, 1, 3, 0, 0, 3, 0, 6, 2, 8, 16, 21, 39, 48, 113, 92, 93 ,127, 159, 137, 46, 238, 132 ,124, 185 ,171, 250, 250 ,187, 119 ,151, 292, 94, 281, 146, 163 ,104, 156, 272, 273, 212, 210, 135, 187, 208, 310, 276 ,235, 246, 190, 232, 254, 446,
314, 402 ,276, 279, 386 ,402, 238, 581, 434, 159, 261, 356, 440, 498, 495, 462 ,306, 233, 396, 331, 418, 293 ,431 ,300, 222, 222, 479 ,501, 702
,790, 681)
x = 1:length(y)
现在,我试图预测第90个数据点 将使用多项式回归, 其中的数据,#1是0,#89是681。我已经测试了我的模型,我认为到8度的多项式曲线是最合适的。
我试了一下代码 predict(formula=y~poly(x,8),90)
而且它给出了一些奇怪的错误(对我来说毫无意义),说怎么没有适用的方法。
Error in UseMethod("predict") :
no applicable method for 'predict' applied to an object of class "c('double', 'numeric')"
为什么这个不能用? 在搜罗了无数的R文档、博客和论坛之后,在我看来,这应该可以正常工作。
什么东西反而能用呢? 我试过其他使用预测法的方法,我认为这是最接近我想要的解决方案。第90个数据点的预测值。
有其他建议吗? 我不确定我的模型是最好的,我欢迎你提出任何建议。例如,你可能会认为,使用6度多项式建模比8度多项式更好,如果你有合理的理由,我会同意你的观点。
谢谢您
注意:请,请不要删除感谢。我认识一些堆栈溢出者 恨 它,但我觉得它给人一种个人风格。
predict
在模型上工作。你有一个公式,但没有一个模型。你需要先拟合一个模型,然后在此基础上进行预测。
通常这是分两步完成的,因为通常人们希望保存模型,这样它就可以用于更多的预测,而不仅仅是一个单一的预测--也许是检查系数,检查假设,获得模型拟合诊断,做出不同的预测--而无需重新拟合模型。
这里我将使用最简单的模型,可以采用你的公式。lm
意思是 "线性模型"。你也可以使用GLM,或者塬理,或者随机森林,GAM,神经网,或者......很多很多不同的模型。
my_model = lm(formula=y~poly(x,8))
predict(my_model, newdata = list(x = 90))
# 1
# 977.9421
当然,你也可以把这些组合成一行,而不必费心去保存并命名为 "线性模型"。my_model
:
predict(lm(formula=y~poly(x,8)), newdata = list(x = 90))
我不知道我的模型是最好的。
不是这样的 几乎可以肯定。但这没关系--很难知道一个模型在任何意义上都是最好的。
并且我欢迎你提出任何建议。例如,你可能会认为,使用6度多项式进行建模比使用8度多项式更好。
我想我从来没有见过8次方程的多项式。(甚至是6度。)这太高了。我不知道你的数据是什么,所以我不能说太多。如果你有理由认为8度多项式是准确的,那就去做吧。但如果你只是想拟合一条晃动的曲线,并向前推断一小段,那么使用 mgcv::gam
或 stats::loess
模式将是更标准的选择。