【问题标题】:R: How to plot custom range of polynomial produced by lm poly fitR:如何绘制由 lm poly fit 生成的自定义多项式范围
【发布时间】:2021-06-11 07:24:32
【问题描述】:

我对@9​​87654325@ 的输出产生的系数感到困惑

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

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

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

  • 将四阶多项式拟合到数据中
  • 用一种颜色在数据范围内绘制四阶多项式
  • 在从最后一个值到最后一个值 + 10(预测)的范围内以不同的颜色绘制 4 阶多项式

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

这是来自 Desmos 的屏幕截图。我复制并粘贴了相同的系数,如在控制台中键入poly4model$coefficients 所示。但是,一定是出了点问题,因为这个函数和数据完全不同。

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

【问题讨论】:

    标签: r regression lm polynomials poly


    【解决方案1】:

    最简单的方法是使用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“返回或评估1次正交多项式到指定点集合x的次数:这些都与0次常数多项式正交。”要返回“正常”多项式系数,需要在函数中使用“raw=TRUE”选项。

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

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

    【讨论】:

    • 谢谢... 几个问题:我看到seq 仍然需要生成存储在v 中的序列。大概没有办法摆脱那个额外的步骤?我很确定不需要vv,但我认为也许额外的向量v 也是不必要的。第二个问题:是否需要两次拨打predict?似乎它在 lines 函数内部以及本身被调用。最后:没看懂最后加的注释:为什么需要raw=TRUE? (或者是否需要?)感谢您迄今为止的帮助!
    • 实际上还有一个问题,很抱歉让许多问题不知所措:如果我想预测 x 轴范围之外的范围,这可能吗?例如,我可以以某种方式从 30 绘制到 60 吗?
    • 有很多东西要解压。是的,使用seq 函数定义数据框以避免定义“v”。第一个电话predict 是为了演示,我可以删除它。关于raw=TRUE,请查看 poly 帮助页面。 poly 函数可以为正交多项式或标准多项式(大多数人习惯使用的)生成系数。这是比我真正想知道的更深层次的数学。对于第二条评论,是的,您可以预测任何价值,但您应该这样做吗?对于大于二阶的任何东西,我不会预测超出数据的限制
    • 一个公平的评论 - 预测范围之外的目的是证明多项式通常在预测数据的约束范围之外非常糟糕。 (因为他们炸毁了)
    猜你喜欢
    • 2019-04-09
    • 2013-03-21
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多