データフレームxとyがあり、yの最大値を知っています。このデータを2次モデルに適合させたいと思います。最大値を知っているRでどうすればそれを行うことができますか?最大値がわからない場合は、lm(y〜x + I(x ^ 2))に適合させます。誰かがこれについて考えを持っていますか?前もって感謝します!
2 に答える
制約の対象となる二乗和を最小化する必要があります。lm
このような制約は許可されていないため、などの一般的な最適化関数を使用する必要がありますoptim
。これがそれを行うことができる1つの方法です。
いくつかのデータを作成します。ここでは、既知の最大値は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)
微積分を使用して、最大点の式を計算します。微分すると方程式の定数の一部が削除されるため、その最大値が何である必要があるかがわかっていると、計算が簡単になります。
正しく思い出せば、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
2番目の方程式をゼロに設定して停留点を取得し、次にそのxの値を3番目の方程式に入れて、それが最大か最小かを調べます。