我想通过散点图poly
找到最适合的函数。
示例数据:
x <- c(32,64,96,118,126,144,152.5,158)
y <- c(99.5,104.8,108.5,100,86,64,35.3,15)
我用
获得了这个功能poly(lm(y ~ poly(x, 3)))
但是当我想使用optimize
时,
o <- optimize(f = lm(y ~ poly(x, 3, raw=TRUE)), interval=c(0,150))
我得到了
Error in (function (arg) : could not find function "f"
我如何调用优化和可能的辅助函数来获得最佳值(在这种情况下最大值)?
答案 0 :(得分:1)
Optimize
功能状态:
函数optimize从下到上搜索函数f相对于其第一个参数的最小值或最大值。
和
maximum logical. Should we maximize or minimize (the default)
所以你的公式会寻找最小值。
lm
不返回x的函数,它返回一个元素列表(系数,截距等),您可以将它们用于多项式。
您需要做的是创建一个函数evaluate.polynom
在知道lm
optimize
X2<- x^2; X3<-x^3; df= data.frame(y = y, x = x, X2 = X2, X3 = X3)
L<-lm(y ~ X3 + X2 + x, data = df ) ### not being familiar with poly I prefer to do this
P<-function(x){ L$coefficients[1] + x^3 * L$coefficients[2] + x^2*L$coefficients[3] + x*L$coefficients[4] }
o<- optimize(f = P, interval = c(0,150), maximum = TRUE)
它说最大值是92。
library(ggplot2);qplot(x = 0:150, y = P(0:150), geom = "line")+theme_bw()
我们可以清楚地看到我们的多项式在边缘达到最大值,但optimize
找到了局部最大值。如果你真的想要你的间隔最大值,我建议你也要在间隔的边缘评估你的多项式。
我们用lm
计算的拟合是正确的,我们没有在那里犯错。