我有一个数据框x和y,我知道y的最大值。我想将这些数据拟合到二次模型中。我怎么能在R知道最大值?如果我不知道最大值,我会用lm(y~x + I(x ^ 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)
答案 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的值放入第三个以找出它是最大值还是最小值。