【问题标题】:How to fit a quadratic model knowing the maximum in R?如何拟合知道 R 中的最大值的二次模型?
【发布时间】:2011-10-27 15:03:53
【问题描述】:

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

【问题讨论】:

  • 你是真的知道y的最大值还是知道y的最大值的x坐标?
  • 想知道上一条评论的答案。如果答案是“y 的最大值”,那么@Aaron 的优雅答案有效。如果答案是“x 坐标”,那么lm(y~I((x-xcoordmax)^2)) 应该可以工作。
  • Kinda 让您在回答 userXXXXXX 人的问题时三思而后行,代表几乎为零。亚伦的答案应该得到百万分。
  • 哦,我不知道。其他人似乎发现它很有用,即使 OP 消失了。另外,如果您以前做过类似的事情,这就像一个五分钟的答案。但感谢@Spacedman 的赞誉。
  • 对不起,伙计们,我不在城里,这就是为什么我没有关注你的答案和 cmets。非常感谢您的合作。

标签: r max regression quadratic


【解决方案1】:

你必须最小化受约束的平方和; 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)

【讨论】:

    【解决方案2】:

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

    如果我没记错的话,1 个变量的简单函数在 f'(x) = 0 和 f''(x)

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

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

    将第二个方程设为零以获得静止点,然后将 x 的值代入第三个方程以确定它是最大值还是最小值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-27
      • 2020-02-29
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多