Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 数据拟合多项式-数据帧中数据的困难_R_Plot_Curve - Fatal编程技术网

R 数据拟合多项式-数据帧中数据的困难

R 数据拟合多项式-数据帧中数据的困难,r,plot,curve,R,Plot,Curve,我有下面的例子来拟合数据的三阶多项式: # rm(list = ls(all = TRUE)) # clear workspace var2 <- c(32,64,96,118,126,144,152.5,158) var3 <- c(99.5,104.8,108.5,100,86,64,35.3,15) fit1 <- lm(var3 ~ poly(var2,3,raw=TRUE)) plot(var2, var3 , pch=19, ylim=c(0,150)) xx &l

我有下面的例子来拟合数据的三阶多项式:

# rm(list = ls(all = TRUE)) # clear workspace
var2 <- c(32,64,96,118,126,144,152.5,158)
var3 <- c(99.5,104.8,108.5,100,86,64,35.3,15)
fit1 <- lm(var3 ~ poly(var2,3,raw=TRUE))
plot(var2, var3 , pch=19, ylim=c(0,150))
xx <- seq(30,160, length = 20)
lines(xx, predict(fit1, data.frame(var2 = xx)), col="blue")
这很有效。但是,我在将这种方法应用于数据帧中我自己的数据时遇到了一些困难:

rm(list = ls(all = TRUE))
mydf <- data.frame(var2 = c(32, 64, 96, 118, 126, 144, 152.5, 158), var3 = c(99.5, 104.8, 108.5, 100, 86, 64, 35.3, 15))
fit2 <- lm(mydf$var3 ~ poly(mydf$var2,3,raw=TRUE))
xx <- seq(min(mydf$var2), max(mydf$var2), length = 10)    
plot(mydf$var2, mydf$var3 , pch=19, ylim=c(0,150))
lines(xx, predict(fit2, data.frame(var2 = xx)), col="blue")

这会在xy.coordsx,y中产生错误:“x”和“y”长度不同,我在整理时遇到困难。我已经检查了第二段代码的每个部分的属性,仍然没有发现问题。我确信我忽略了一些非常明显的事情

如果您想从模型中进行预测,那么应该使用data参数而不是$syntax,例如

fit2 <- lm(var3 ~ poly(var2,3,raw=TRUE), data=mydf)
lines(xx, predict(fit2, data.frame(var2 = xx)), col="blue")
值得一提的是,正交多项式(即忽略原始值=真值)在数值上更稳定;如果不需要将系数解释为零处的截距/线性/二次/三次趋势,那么从长远来看,这样做会更好


尝试将长度更改为8英寸xx:

mydf <- data.frame(var2 = c(32, 64, 96, 118, 126, 144, 152.5, 158), var3 = c(99.5, 104.8, 108.5, 100, 86, 64, 35.3, 15))
fit2 <- lm(mydf$var3 ~ poly(mydf$var2,3,raw=TRUE))
xx <- seq(min(mydf$var2), max(mydf$var2), length = 8)    
plot(mydf$var2, mydf$var3 , pch=19, ylim=c(0,150))
lines(xx, predict(fit2, data.frame(var2 = xx)), col="blue")

虽然不太合适,但它仍然有效。

您的答案在某种程度上是有效的,但如果OP想使用结果进行插值,则会令人失望……是的。你的答案很完美。我想我应该删除我的答案。由于我不理解的原因,在这个解决方案中,虽然错误消失了,但与原始示例相比,拟合度非常差。另外,在最初的示例中,设置长度=一个大的数字(例如100)效果非常好……这完全解决了我的问题。除了我不明白为什么另一种方法不起作用——也就是说,这两个例子之间有什么区别。谢谢你提供的关于raw=TRUE@marcel的提示:我还想问@BenBolker同样的问题。为什么mydf$var3等不起作用?