在R中为非线性模型添加约束

时间:2015-03-27 17:37:54

标签: r nls

我在为非线性模型添加约束时遇到了麻烦。假设我有以下大致为高斯积分的数据:

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,但我无法弄清楚如何使用它。

我知道这样做并不一定非常适合这样的数据,但我试图复制另一个人的工作,这就是他们所做的。

1 个答案:

答案 0 :(得分:0)

您可以手动强加限制。也就是说,对于任何参数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