[英]How to fit a quadratic model knowing the maximum in R?
我有一個數據框x和y,我知道y的最大值。 我想將此數據擬合為二次模型。 如何在R中知道最大值? 如果我不知道最大值,則將其與lm(y〜x + I(x ^ 2))擬合。 誰能對此有所了解? 提前致謝!
您必須根據約束最小化平方和; 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變量函數在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的值放到第三個方程中以找出它是最大值還是最小值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.