我在为非线性模型添加约束时遇到了麻烦。假设我有以下大致为高斯积分的数据:
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
,但我无法弄清楚如何使用它。
我知道这样做并不一定非常适合这样的数据,但我试图复制另一个人的工作,这就是他们所做的。
答案 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