【问题标题】:R- Polynomial Linear model coefficients not fit predicted values of modelR-多项式线性模型系数不适合模型的预测值
【发布时间】:2013-05-25 13:16:28
【问题描述】:

我正在尝试将某些模型拟合到某些数据中,并且生成的模型可以预测合理的值,并且这些图看起来是正确的。但是当提取系数并分别绘制函数时,它们毫无意义!我显然做错了什么,所以请有人告诉我错误在哪里?

数据:

dput(distcur)
structure(list(id1 = c(1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6
), range = c(-39.898125, -21.448125, -11.07, -3.22875, 3.776484375, 
12.309609375, 22.399453125, 39.235078125), meanrat = c(20.2496, 
17.7504273504274, 12.76875, 2.475, -1.4295652173913, -3.9603305785124, 
-14.7008547008547, -19.7366666666667)), .Names = c("id1", "range", 
"meanrat"), row.names = 9:16, class = "data.frame")

library(ggplot2)

id = 1.6
degree = 3

press_x <- seq(min(distcur$range), max(distcur$range), length = 500)
moddist3b <- lm(meanrat ~ poly(range, degree), distcur) 
valsdist = data.frame(predict(moddist3b, data.frame(range = press_x)))

colnames(valsdist) = "pred"

valsdist$id1 = id

allvals = cbind(valsdist, press_x)

summary(moddist3b)

#test plot
pdf(paste("mod-",measure,id ))
TITLE = paste("Distance ID: ", id, "Model = line, Points = exp1")

p = ggplot(allvals, aes(x=press_x, y=pred, colour=factor(id1))) + 
             geom_line() + 
geom_point(data=distcur, aes(shape=factor(id1), x = range, y = meanrat, colour = factor(id1))) +
                ylim(-100, 100) +
                labs(title=TITLE) +
                ylab("Mean Rating (%)") +
                xlab(measure) 


print(p)
dev.off()

我知道图像质量很差,但它表明它是正确的。然而,从用于构建函数的模型中获得的系数与该图完全不同:

summary(moddist3b)

Call:
lm(formula = meanrat ~ poly(range, degree), data = distcur)

Residuals:
       9       10       11       12       13       14       15       16 
-0.20134  0.44939  1.65996 -2.80500 -1.14594  2.98617 -0.92081 -0.02244 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)            1.6770     0.8281   2.025   0.1128    
poly(range, degree)1 -37.7155     2.3423 -16.102  8.7e-05 ***
poly(range, degree)2  -2.9435     2.3423  -1.257   0.2773    
poly(range, degree)3   6.4888     2.3423   2.770   0.0503 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 2.342 on 4 degrees of freedom
Multiple R-squared: 0.9853, Adjusted R-squared: 0.9743 
F-statistic: 89.51 on 3 and 4 DF,  p-value: 0.0004019 

给函数 y = 6.49x^3 −2.94x​​^2 − 37.72x + 1.68

在谷歌上绘制清楚地表明该函数与 R 中的图(来自模型)完全不同

https://www.google.com/search?q=6.49x^3+%E2%88%922.94x^2+%E2%88%92+37.72x+%2B+1.68&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:unofficial&client=iceweasel-a&channel=fflb#client=iceweasel-a&rls=org.mozilla:en-US%3Aunofficial&channel=fflb&sclient=psy-ab&q=6.49*x^3+-2.94*x^2+-+37.72*x+%2B+1.68&oq=6.49*x^3+-2.94*x^2+-+37.72*x+%2B+1.68&gs_l=serp.3...3610.3975.1.4155.2.2.0.0.0.0.107.147.1j1.2.0...0.0...1c.1.14.psy-ab.4C6De6gdmtg&pbx=1&bav=on.2,or.r_qf.&bvm=bv.47008514,d.d2k&fp=5e81885614cfda4f&biw=1440&bih=667

【问题讨论】:

  • 只是一个猜测,但你可能想用I(poly(range,degree)) 括起你的独立参数,所以formula 会按照你想要的方式解释。 +* 之类的东西在 R 公式中具有不同的含义。
  • @CarlWitthoft 添加I 给出了完全相同的模型,但是预测的值几乎是一条水平线,离实验点更远。系数仍然与我的问题相同。不知道为什么它会影响预测,但我仍然没有绘制线的功能。

标签: r linear-regression


【解决方案1】:

您遇到的问题与ggplot 无关。相反,它是您定义线性模型的方式。顺便说一句,我弄清楚发生了什么的方法是在 0 时进行预测:

R> (moddist3b <- lm(meanrat ~ poly(range, 3), distcur) )

Coefficients:
(Intercept)  poly(range, 3)1  poly(range, 3)2  poly(range, 3)3  
       1.68           -37.72            -2.94             6.49  

R> predict(moddist3b, data.frame(range = 0))
    1 
2.733 

并注意预测已关闭(应为 1.68)。

无论如何,您需要使用参数raw=TRUE 来拟合您的模型

(moddist3b <- lm(meanrat ~ poly(range, 3, raw=TRUE), distcur) )
predict(moddist3b, data.frame(range = 0))

这可以满足您的期望。默认情况下,poly 使用正交多项式。有关详细信息,请参阅 this blog postpoly 帮助页面。

【讨论】:

  • 谢谢,我会尝试并回复您。我不认为它是 ggplot2,而是我创建模型的一些东西。我发现很难找到涵盖除基础知识之外的任何内容的优质资源。从来没有遇到过raw。将查看您提到的博客。干杯
猜你喜欢
  • 2014-05-01
  • 2016-07-12
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
相关资源
最近更新 更多