很长一段时间以来,我一直试图在 R 中估计一个相当混乱的非线性回归模型。在无数次尝试使用该nls
功能失败后,我现在正在尝试我optim
过去曾多次使用过的运气。对于此示例,我将使用以下数据:
x1 <- runif(1000,0,7)
x2 <- runif(1000,0,7)
x3 <- runif(1000,0,7)
y <- log(.5 + .5*x1 + .7*x2 + .4*x3 + .05*x1^2 + .1*x2^2 + .15*x3^2 - .05*x1*x2 - .1*x1*x3 - .07*x2*x3 + .02*x1*x2*x2) + rnorm(1000)
我想估计上面 log() 函数中多项式表达式中的参数,因此我定义了以下函数来复制非线性最小二乘回归:
g <- function(coefs){
fitted <- coefs[1] + coefs[2]*x1 + coefs[3]*x2 + coefs[4]*x3 + coefs[5]*x1^2 + coefs[6]*x2^2 + coefs[7]*x3^2 + coefs[8]*x1*x2 + coefs[9]*x1*x3 + coefs[10]*x2*x3 + coefs[11]*x1*x2*x3
error <- y - log(fitted)
return(sum(error^2))
}
为了避免 log() 表达式中的负起始值,我首先估计下面的线性模型:
lm.1 <- lm(I(exp(y)) ~ x1 + x2 + x3 + I(x1^2) + I(x2^2) + I(x3^2) + I(x1*x2) + I(x1*x3) + I(x2*x3) + I(x1*x2*x3))
intercept.start <- ifelse((min(fitted(lm.1)-lm.1$coefficients[1])) <= 0, -(min(fitted(lm.1)-lm.1$coefficients[1])) + .5, .5)
coefs.start <- c(intercept.start,lm.1$coefficients[-1])
上面的定义intercept.start
保证了 log() 内部的表达式一开始就严格为正。但是,当我运行optim
命令时
nl.model <- optim(coefs.start, g, method="L-BFGS-B")
我收到以下错误消息
Error in optim(coefs.start, g, method = "L-BFGS-B") :
L-BFGS-B needs finite values of 'fn'
In addition: Warning message:
In log(fitted) : NaNs produced
有谁知道我如何强制optim
例程简单地忽略会在 log() 表达式中产生负值的参数估计?提前致谢。