如何解决R:如何绘制 lm poly fit 生成的自定义多项式范围
我对 lm
的输出产生的系数感到困惑
这是我正在处理的数据的副本
(postprocessed.csv)
"","time","value"
"1",1,2.61066016308988
"2",2,3.41246054742996
"3",3,3.8608767964033
"4",4,4.28686048552237
"5",5,4.4923132964825
"6",6,4.50557049744317
"7",7,4.50944447661246
"8",8,4.51097373134893
"9",9,4.48788748823809
"10",10,4.34603985656981
"11",11,4.28677073671406
"12",12,4.20065901625172
"13",13,4.02514194962519
"14",14,3.91360194972916
"15",15,3.85865748409081
"16",16,3.81318053258601
"17",17,3.70380706527433
"18",18,3.61552922363713
"19",19,3.61405310598722
"20",20,3.64591327503384
"21",21,3.70234435835577
"22",22,3.73503970503372
"23",23,3.81003078640584
"24",24,3.88201196162666
"25",25,3.89872518158949
"26",26,3.97432743542362
"27",27,4.2523675144599
"28",28,4.34654855854847
"29",29,4.49276038902684
"30",30,4.67830892029687
"31",31,4.91896819673664
"32",32,5.04350767355202
"33",33,5.09073406942046
"34",34,5.18510849382162
"35",35,5.18353176529036
"36",36,5.2210776270173
"37",37,5.22643491929207
"38",38,5.11137006553725
"39",39,5.01052467981257
"40",40,5.0361056705898
"41",41,5.18149486951409
"42",42,5.36334869132276
"43",43,5.43053620818444
"44",44,5.60001072279525
我使用以下脚本为该数据拟合了一个四阶多项式:
library(ggplot2)
library(matrixStats)
library(forecast)
df_input <- read.csv("postprocessed.csv")
x <- df_input$time
y <- df_input$value
df <- data.frame(x,y)
poly4model <- lm(y~poly(x,degree=4),data=df)
v <- seq(30,40)
vv <- poly4model$coefficients[1] +
poly4model$coefficients[2] * v +
poly4model$coefficients[3] * (v ^ 2) +
poly4model$coefficients[4] * (v ^ 3) +
poly4model$coefficients[5] * (v ^ 4)
pdf("postprocessed.pdf")
plot(df)
lines(v,vv,col="red",pch=20,lw=3)
dev.off()
我最初尝试使用 predict
函数来执行此操作,但无法使其正常工作,因此求助于使用一些新向量 v
和 vv
来实现此“解决方法”将线的数据存储在我要绘制的区域中。
最终,我正在尝试这样做:
- 对数据拟合四阶多项式
- 用一种颜色在数据范围内绘制四阶多项式
- 在从最后一个值到最后一个值 + 10(预测)的范围内以不同颜色绘制四阶多项式
目前我相当确定使用 v
和 vv
来做到这一点不是“最好的方法”,但我认为它应该工作。发生的事情是我得到了非常大的值。
这是来自 Desmos 的屏幕截图。我通过在控制台中输入 poly4model$coefficients
复制并粘贴了如图所示的相同系数。然而,一定是出了什么问题,因为这个函数与数据完全不同。
我想我已经提供了足够的信息来运行这个简短的脚本。不过我也会添加pdf。
解决方法
使用 predict
函数创建线条最简单。为此,您将模型和带有所需自变量的数据框传递给 predict
函数。
x <- df_input$time
y <- df_input$value
df <- data.frame(x,y)
poly4model <- lm(y~poly(x,degree=4),data=df)
v <- seq(30,40)
#Notice the column in the dataframe is the same variable name
# as the variable in the model!
predict(poly4model,data.frame(x=v))
plot(df)
lines(v,predict(poly4model,data.frame(x=seq(30,40))),col="red",pch=20,lw=3)
注意
函数 poly
“返回或计算指定点集 x 上的 1 次正交多项式:这些都与 0 次常数多项式正交。”要返回“正常”多项式系数,需要在函数中使用“raw=TRUE”选项。
poly4model <- lm(y~poly(x,degree=4,raw=TRUE),data=df)
现在你上面的等式可以工作了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。