【问题标题】:How to plot quadratic regression in R?如何在 R 中绘制二次回归?
【发布时间】:2017-03-24 03:42:36
【问题描述】:

以下代码在 R 中生成二次回归。

 lm.out3 = lm(listOfDataFrames1$avgTime ~ listOfDataFrames1$betaexit + I(listOfDataFrames1$betaexit^2) + I(listOfDataFrames1$betaexit^3))

 summary(lm.out3)

Call:
lm(formula = listOfDataFrames1$avgTime ~ listOfDataFrames1$betaexit + 
    I(listOfDataFrames1$betaexit^2) + I(listOfDataFrames1$betaexit^3))

Residuals:
    Min      1Q  Median      3Q     Max 
-14.168  -2.923  -1.435   2.459  28.429 

Coefficients:
                                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)                        199.41      11.13  17.913  < 2e-16 ***
listOfDataFrames1$betaexit       -3982.03     449.49  -8.859 1.14e-12 ***
I(listOfDataFrames1$betaexit^2)  32630.86    5370.27   6.076 7.87e-08 ***
I(listOfDataFrames1$betaexit^3) -93042.90   19521.05  -4.766 1.15e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7.254 on 63 degrees of freedom
Multiple R-squared:  0.9302,    Adjusted R-squared:  0.9269 
F-statistic: 279.8 on 3 and 63 DF,  p-value: < 2.2e-16

但是如何在图表上绘制曲线我很困惑。

获取图表:

 plot(listOfDataFrames1$avgTime~listOfDataFrames1$betaexit)

但是曲线?


在不手动复制值的情况下有什么办法吗? 就像 mso 建议的那样,虽然它有效。

【问题讨论】:

  • 你的第一条语句可以写成:lm.out3 = lm(avgTime ~ betaexit + I(betaexit^2) + I(betaexit^3), data=listOfDataFrames1)
  • 是的,你是对的。没注意到。谢谢。

标签: r


【解决方案1】:

这应该可行。

# not tested
lm.out3 = lm(avgTime ~ poly(betaexit,3,raw=TRUE),listofDataFrames3)
plot(avgTime~betaexit,listofDataDFrames3)
curve(predict(lm.out3,newdata=data.frame(betaexit=x)),add=T)

由于您没有提供任何数据,这里是一个使用内置 mtcars 数据集的工作示例。

fit <- lm(mpg~poly(wt,3,raw=TRUE),mtcars)
plot(mpg~wt,mtcars)
curve(predict(fit,newdata=data.frame(wt=x)),add=T)

一些注意事项:

(1) 在lm(...)formula=... 参数中引用外部数据结构是一个非常糟糕的主意。相反,引用data=... 参数中引用的数据框的列,如上所述和@mso 指出的那样。

(2) 您可以按照@mso 的建议指定公式,也可以将poly(...) 函数与raw=TRUE 一起使用。

(3) curve(...) 函数将一个表达式作为其第一个参数,该表达式必须有一个变量x,该变量将由图形 x 轴的值自动填充。所以在这个例子中,表达式是:

predict(fit,newdata=data.frame(wt=x))

在模型上使用predict(...),其数据框具有x 给出的wt(预测变量)。

【讨论】:

  • 好方法。我试图扩展 OP 自己的代码。我还发布了 ggplot 方法。
  • 太棒了!如何改变曲线的度数?
  • 不确定你的意思。 poly(...) 的第二个参数是拟合多项式的次数
【解决方案2】:

用 ggplot 试试:

library(ggplot)
ggplot(listOfDataFrames1, aes(x=betaexit, y=avgTime)) + geom_point()+stat_smooth(se=F)

使用 mtcars 数据:

ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point()+stat_smooth(se=F, method='lm', formula=y~poly(x,3))

【讨论】:

    【解决方案3】:

    试试:

    with(listOfDataFrames1, plot(betaexit, avgTime))
    with(listOfDataFrames1, lines(betaexit, 199-3982*betaexit+32630*betaexit^2-93042*betaexit^3))
    

    【讨论】:

    • 再次检查。我希望在散点图本身上有曲线。
    • lines(listOfDataFrames1$avgTime, 199-3982*listOfDataFrames1$avgTime+32630*listOfDataFrames1$avgTime^2-93042*listOfDataFrames1$avgTime^3) 这段代码没有任何作用。请检查。
    • 您错误地替换了 x 和 y。正确的应该是: with(listOfDataFrames1, plot(betaexit,avgTime)) with(listOfDataFrames1, lines(betaexit, 199-3982*betaexit+32630*betaexit^2-93042*betaexit^3))....谢谢!
    • “手动复制值”是什么意思?在此处发布 str(listOfDataFrames1) 和/或 dput(listOfDataFrames1) 和/或绘图以使事情变得清晰。尝试绘图(betaexit,199-3982*betaexit+32630*betaexit^2-93042*betaexit^3))。应该出现一些图表或者应该有一些错误输出。
    猜你喜欢
    • 2018-09-04
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 2014-04-22
    • 2021-05-09
    • 1970-01-01
    相关资源
    最近更新 更多