如何在R中绘制二次回归曲线?

5
以下代码生成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)。 - rnso
是的,你说得对。我没注意到。谢谢。 - Abhishek Bhatia
3个回答

9

这应该可以工作。

# 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=...参数中引用外部数据结构是一个非常糟糕的主意。相反,应该像上面和 @mso 指出的那样,在data=...参数中引用一个数据框的列。

(2) 你可以按照 @mso 的建议指定公式,或者使用poly(...)函数和raw=TRUE

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

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

使用给定由x表示的预测变量wt的数据框架,在模型上使用predict(...)


好的方法。我正在尝试扩展OP自己的代码。我还发布了ggplot方法。 - rnso
太好了!如何变化曲线的程度? - Abhishek Bhatia
不确定您的意思。poly(...)的第二个参数是拟合多项式的次数。 - jlhoward

5

尝试使用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))

enter image description here


1

尝试:

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

请再检查一遍。我希望散点图上有曲线本身。 - Abhishek Bhatia
lines(listOfDataFrames1$avgTime, 199-3982listOfDataFrames1$avgTime+32630listOfDataFrames1$avgTime^2-93042*listOfDataFrames1$avgTime^3) 这段代码没有任何作用,请检查。 - Abhishek Bhatia
你误调换了x和y。正确的应该是: with(listOfDataFrames1, plot(betaexit,avgTime)) with(listOfDataFrames1, lines(betaexit, 199-3982betaexit+32630betaexit^2-93042*betaexit^3))....谢谢! - Abhishek Bhatia
“手动复制数值”是什么意思?发布str(listOfDataFrames1)和/或dput(listOfDataFrames1)和/或在此处绘图以使事情清晰。尝试绘制plot(betaexit,199-3982betaexit+32630betaexit^2-93042*betaexit^3))。应该出现一些图形或者会有一些错误输出。 - rnso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接