向 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