如何拟合知道R中最大值的二次模型?

时间:2011-10-27 15:03:54

标签: r max regression quadratic

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

2 个答案:

答案 0 :(得分: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

创建一个函数来获得x处点的二次曲线 给定二次和线性系数并给出最大值M. 微积分很简单;有关详细信息,请参阅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)

image comparing lm fit with my fit

答案 1 :(得分:0)

我会使用微积分来计算最大点的表达式。区分将消除方程中的一些常数,因此如果您知道最大值需要的话,计算会更容易。

如果我没记错的话,1变量的简单函数在f'(x)= 0和f'(x)<0时具有最大值。 0.检查我。

所以如果你的函数是f(x):

f(x) = a0 + a1*x + a2*x*x
f'(x) = a1 + 2*a2*x
f''(x) = 2*a2

将第二个等式设置为零以获得静止点,然后将x的值放入第三个以找出它是最大值还是最小值。