繁体   English   中英

R:如何 plot 自定义范围的多项式产生的 lm 多项式拟合

[英]R: How to plot custom range of polynomial produced by lm poly fit

我对lm的 output 产生的系数感到困惑

这是我正在使用的数据的副本

(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 function 来执行此操作,但无法使其正常工作,因此使用一些新向量vvv来实现此“解决方法”来存储我正在尝试 plot 的区域中的行的数据.

最终,我正在尝试这样做:

  • 将四阶多项式拟合到数据
  • Plot 一种颜色数据范围内的四阶多项式
  • Plot 从最后一个值到最后一个值 + 10(预测)范围内的四阶多项式,不同颜色

目前我相当确定使用vvv来做到这一点不是“最好的方法”,但我认为它应该可以工作。 正在发生的事情是我得到了非常大的值。

这是 Desmos 的截图。 我通过在控制台中输入poly4model$coefficients复制并粘贴了相同的系数。 但是,肯定是出了点问题,因为这个 function 与数据完全不同。

我想我已经提供了足够的信息来运行这个简短的脚本。 但是,我也会添加 pdf。

脱模剂

pdf

最简单的方法是使用predict function 来创建您的生产线。 为此,您将 model 和具有所需自变量的数据帧传递给predict function。

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)

在此处输入图像描述

笔记
function poly “返回或评估 1 次正交多项式到指定点 x 上的次数:这些都与 0 次常数多项式正交。” 要返回“正常”多项式系数,需要使用 function 中的“raw=TRUE”选项。

poly4model <- lm(y~poly(x, degree=4, raw=TRUE), data=df)

现在你上面的等式就可以了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM