2014-05-12 73 views
0

我有一個類似的問題,我想計算R中的非線性迴歸,但是我得到一個錯誤。非線性迴歸R

這是我的代碼:

f <- function(x1,x2,x3,a,b1,b2,b3) {a * (x1^b1) * (x2^b2) * (x3^b3) } 

# generate some data 
x1 <- c(9,9,12,12,12,16,9,16) 
x2 <- c(0.8,1,0.8,1,1.2,1.2,1.2,1) 
x3 <- c(0.14,0.12,0.16,0.14,0.12,0.16,0.16,0.14) 
y <- c(304,284,435,489,512,854,517,669) 
dat <- data.frame(x1,x2,x3, y) 

# fit a nonlinear model 
fm <- nls(y ~ f(x1,x2,x3,a,b1,b2,b3), data = dat, start = c(a=0, b1=0,b2=0,b3=0)) 

# get estimates of a, b 
co <- coef(fm) 

而且我得到了這個錯誤:

Error in nlsModel(formula, mf, start, wts) : singular gradient matrix at initial parameter estimates

我該怎麼辦?

謝謝!

回答

2

你需要很好的起點值:建議對非線性模型應遵循

#starting values from linearization 
fit0 <- lm(log(y) ~ log(x1) + log(x2) +log(x3), data=dat) 

# fit a nonlinear model 
fm <- nls(y ~ f(x1,x2,x3,a,b1,b2,b3), data = dat, 
      start = list(a=exp(coefficients(fit0)[1]), 
        b1=coefficients(fit0)[2], 
        b2=coefficients(fit0)[3], 
        b3=coefficients(fit0)[4])) 
summary(fm) 
# Parameters: 
#  Estimate Std. Error t value Pr(>|t|)  
# a 265.19567 114.37494 2.319 0.081257 . 
# b1 0.97277 0.08186 11.884 0.000287 *** 
# b2 0.97243 0.12754 7.624 0.001589 ** 
# b3 0.91938 0.17032 5.398 0.005700 ** 

通常的診斷。

另請注意,起始值作爲列表提供給nls

0

或者根本沒有起始值。那麼nls將使用它的「非常便宜的猜測」,它與這個數據集一起工作。

nls(y ~ f(x1,x2,x3,a,b1,b2,b3), data = dat) 

順便說一句 - 至少在3.1.0 - 初始值是「命名列表或指定數值向量」所以你可以使用

sVec <- coef(lm(log(y) ~ log(x1)+log(x2)+log(x3), dat)) 
sVec[1] <- exp(sVec[1]) 
names(sVec) <- c("a", "b1", "b2", "b3") 
nls(y ~ f(x1,x2,x3,a,b1,b2,b3), data = dat, start = sVec)