0

我有一个数据框 x 和 y,我知道 y 的最大值。我想将此数据拟合为二次模型。我如何在 R 中知道最大值?如果我不知道最大值,我会用 lm(y~x + I(x^2)) 拟合它。任何人都可以对此有所了解吗?提前致谢!

4

2 回答 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)

图片比较 lm fit 和 my fit

于 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 回答