我有一个数据框 x 和 y,我知道 y 的最大值。我想将此数据拟合为二次模型。我如何在 R 中知道最大值?如果我不知道最大值,我会用 lm(y~x + I(x^2)) 拟合它。任何人都可以对此有所了解吗?提前致谢!
问问题
2554 次
2 回答
8
您必须最小化受约束的平方和;lm
不允许这样的约束,因此您必须使用通用优化函数,例如optim
. 这是可以完成的一种方法。
补一些数据。在这里,我会说已知的最大值是 50。
set.seed(5)
d <- data.frame(x=seq(-5, 5, len=51))
d$y <- 50 - 0.3*d$x^2 + rnorm(nrow(d))
M <- 50
用给定的二次和线性系数和给定的最大 M 制作一个函数来获得 x 处的点的二次曲线。微积分很简单;有关详细信息,请参阅 duffymo 的答案。
qM <- function(a, b, x, M) {
c <- M - (3*b^2)/(4*a)
a*x^2 + b*x + c
}
制作一个函数,得到具有给定二次和线性系数的二次曲线与 d 中的数据之间的平方和。
ff <- function(ab, d, M) {
p <- qM(ab[1], ab[2], d$x, M)
y <- d$y
sum((p-y)^2)
}
获取普通lm
拟合以用作起始值。
m0 <- lm(y ~ I(x^2) + x, data=d)
start <- coef(m0)[2:3]
优化ff
函数中的系数。
o <- optim(start, ff, d=d, M=M)
o$par
绘制一个图,显示拟合的最大值为 50;原来的lm
配合没有。
plot(d)
xs <- seq(-5, 5, len=101)
lines(xs, predict(m0, newdata=data.frame(x=xs)), col="gray")
lines(xs, qM(o$par[1], o$par[2], xs, M))
abline(h=50, lty=3)
于 2011-10-27T15:46:31.633 回答
0
我会使用微积分来计算最大点的表达式。微分将消除等式中的一些常数,因此如果您知道最大值需要是什么,则计算会更容易。
如果我没记错的话,1 个变量的简单函数在 f'(x) = 0 和 f''(x) < 0 处有最大值。请检查我。
因此,如果您的函数是 f(x):
f(x) = a0 + a1*x + a2*x*x
f'(x) = a1 + 2*a2*x
f''(x) = 2*a2
将第二个方程设置为零以获得静止点,然后将 x 的值放入第三个方程以确定它是最大值还是最小值。
于 2011-10-27T15:11:29.657 回答