簡體   English   中英

向R中的非線性模型添加約束

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM