[英]Add a constraint to a nonlinear model in R
我在向非線性模型添加約束時遇到了麻煩。 假設我有以下數據,它們大致是一個集成的高斯:
x = 1:100
y = pnorm(x, mean = 50, sd = 15) + rnorm(length(x), mean = 0, sd = 0.03)
model <- nls(y ~ pnorm(x, mean = a, sd = b), start = list(a = 50, b = 15))
我可以使用nls
擬合數據,但我想添加一個約束,即我的擬合必須在y = 0.25(或最接近0.25的任何點)時精確擬合數據(即沒有殘差)。 我認為我需要為此使用glmc
,但是我不知道如何使用它。
我知道不一定要使擬合符合這樣的數據,但是我正在嘗試復制他人的工作,這就是他們所做的。
您可以手動施加限制。 也就是說,對於任何參數b
我們都可以求解唯一性a
(因為正態分布的cdf嚴格增加),該限制將成立:
getA <- function(b, x, y)
optim(x, function(a) (pnorm(x, mean = a, sd = b) - y)^2, method = "BFGS")$par
然后,在找到(tx,ty)
之后,用
idx <- which.min(abs(y - 0.25))
tx <- x[idx]
ty <- y[idx]
我們可以用一個參數擬合模型:
model <- nls(y ~ pnorm(x, mean = getA(b, tx, ty), sd = b), start = list(b = 15))
得到限制滿足
resid(model)[idx]
# [1] -2.440452e-07
系數a
為
getA(coef(model), tx, ty)
# [1] 51.00536
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.