R:如何绘制 lm poly fit 生成的多项式的自定义范围

R: How to plot custom range of polynomial produced by 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 和 [=15] 来实施此“解决方法” =] 来存储我试图绘制的区域中的线的数据。

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

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

这是 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 “Returns 或计算指定点集 x 上的 1 次正交多项式的度数:这些都与 0 次常数多项式正交。”要return“正常”多项式系数,需要在函数中使用“raw=TRUE”选项。

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

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