在 R 中使用多项式回归预测未来值
Predict Future values using polynomial regression in R
正在尝试使用 R 中的多项式回归来预测样本的未来值。样本中的 y 值形成波浪模式。
例如
x = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
y= 1,2,3,4,5,4,3,2,1,0,1,2,3,4,5,4
但是当为未来值绘制图表时,结果 y
值与预期值完全不同。得到的不是波形图,而是 y
值不断增加的图表。
futurY = 17,18,19,20,21,22
尝试了不同程度的多项式回归,但 futurY
的预测结果与预期的结果大不相同
以下是用于获取结果的示例 R 代码
dfram <- data.frame('x'=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16))
dfram$y <- c(1,2,3,4,5,4,3,2,1,0,1,2,3,4,5,4)
plot(dfram,dfram$y,type="l", lwd=3)
pred <- data.frame('x'=c(17,18,19,20,21,22))
myFit <- lm(y ~ poly(x,5), data=dfram)
newdata <- predict(myFit, pred)
print(newdata)
plot(pred[,1],data.frame(newdata)[,1],type="l",col="red", lwd=3)
这是用于预测未知的未来 y 值的正确方法吗?还是我应该使用其他方法(如预测)?
# Reproducing your data frame
dfram <- data.frame("x" = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16),
"y" = c(1,2,3,4,5,4,3,2,1,0,1,2,3,4,5,4))
从你的图表中我得到了信号的相位和周期。有更好的自动计算方法。
# Phase and period
fase = 1
per = 10
在线性模型函数中,我放入了三角信号方程。
fit <- lm(y ~ I((((trunc((x-fase)/(per/2))%%2)*2)-1) * (x-fase)%%(per/2))
+ I((((trunc((x-fase)/(per/2))%%2)*2)-1) * ((per/2)-((x-fase)%%(per/2))))
,data=dfram)
# Predict the old data
p_olddata <- predict(fit,type="response")
# Predict the new data
newdata <- data.frame('x'=c(17,18,19,20,21,22))
p_newdata <- predict(fit,newdata,type="response")
# Ploting Old and new data
plot(x=c(dfram$x,newdata$x),
y=c(p_olddata,p_newdata),
col=c(rep("blue",length(p_olddata)),rep("green",length(p_olddata))),
xlab="x",
ylab="y")
lines(dfram)
其中黑线是原始信号,蓝色圆圈是对原始点的预测,绿色圆圈是对新数据的预测。
图表显示了模型的完美拟合,因为数据中没有噪音。在真实的数据集中,您可能会发现它,所以拟合看起来不会那么好。
正在尝试使用 R 中的多项式回归来预测样本的未来值。样本中的 y 值形成波浪模式。 例如
x = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
y= 1,2,3,4,5,4,3,2,1,0,1,2,3,4,5,4
但是当为未来值绘制图表时,结果 y
值与预期值完全不同。得到的不是波形图,而是 y
值不断增加的图表。
futurY = 17,18,19,20,21,22
尝试了不同程度的多项式回归,但 futurY
的预测结果与预期的结果大不相同
以下是用于获取结果的示例 R 代码
dfram <- data.frame('x'=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16))
dfram$y <- c(1,2,3,4,5,4,3,2,1,0,1,2,3,4,5,4)
plot(dfram,dfram$y,type="l", lwd=3)
pred <- data.frame('x'=c(17,18,19,20,21,22))
myFit <- lm(y ~ poly(x,5), data=dfram)
newdata <- predict(myFit, pred)
print(newdata)
plot(pred[,1],data.frame(newdata)[,1],type="l",col="red", lwd=3)
这是用于预测未知的未来 y 值的正确方法吗?还是我应该使用其他方法(如预测)?
# Reproducing your data frame
dfram <- data.frame("x" = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16),
"y" = c(1,2,3,4,5,4,3,2,1,0,1,2,3,4,5,4))
从你的图表中我得到了信号的相位和周期。有更好的自动计算方法。
# Phase and period
fase = 1
per = 10
在线性模型函数中,我放入了三角信号方程。
fit <- lm(y ~ I((((trunc((x-fase)/(per/2))%%2)*2)-1) * (x-fase)%%(per/2))
+ I((((trunc((x-fase)/(per/2))%%2)*2)-1) * ((per/2)-((x-fase)%%(per/2))))
,data=dfram)
# Predict the old data
p_olddata <- predict(fit,type="response")
# Predict the new data
newdata <- data.frame('x'=c(17,18,19,20,21,22))
p_newdata <- predict(fit,newdata,type="response")
# Ploting Old and new data
plot(x=c(dfram$x,newdata$x),
y=c(p_olddata,p_newdata),
col=c(rep("blue",length(p_olddata)),rep("green",length(p_olddata))),
xlab="x",
ylab="y")
lines(dfram)
其中黑线是原始信号,蓝色圆圈是对原始点的预测,绿色圆圈是对新数据的预测。
图表显示了模型的完美拟合,因为数据中没有噪音。在真实的数据集中,您可能会发现它,所以拟合看起来不会那么好。