2017-04-08 94 views
1

我試圖按照Nolan和Hitt(2006)的方法來預測硝酸鹽濃度(well = STNM,Y =硝酸鹽濃度)。以下是我正在使用的一些預測變量。 X代表氮負荷變量(例如肥料負荷,化糞池),Z代表運輸變量(例如土壤Ksat),z代表衰減(例如土壤碳,%溼地)。使用nls進行R中的多元非線性迴歸,得到一堆錯誤

這是具有非線性乘法項的線性子模型:

Y = sum(xi*bi) * sum(exp(Zi*ai)) * sum(exp(xi*di)) 

其中b,a和d是參數。我有8個X變量和參數,5個Z變量和參數以及5個變量和參數。以下是我的數據頭部示例(不包括Z3-5或z1-5)。

STNM Y  X1  X2  X3 X4 X5 X6 X7 X8 Z1 Z2 
A-0071 0.49 216.45 0.00 233.03 17.15 0.00 33.87 6.97 37 0.00 113 
A-0420 0.00 23.88 0.00 39.15 23.85 0.00 0.00 6.91 0 0.00 190 
A-0421 0.01 167.00 114.72 295.03 27.18 4.87 3.62 7.00 2 0.00 132 
A-0436 0.38 216.45 0.00 233.03 17.15 0.00 33.87 6.97 37 0.00 52 
A-0725 0.04 13.94 0.00 22.86 22.86 0.00 0.00 7.07 0 57.41 40 
M-0013 0.00 494.77 549.91 1045.28 1.21 10.31 1.34 6.93 18 0.00 225 

現在對於我的問題,當我嘗試運行我使用下面的代碼NLS:

m <- nls(y ~ ((X1*b1)+(X2*b2)+(X3*b3)+(X4*b4)+(X5*b5)+(X6*b6)+(X7*b7)+(X8*b8))*(exp(Z1*a1)+exp(Z2*a2)+exp(Z3*a3)+exp(Z4*a4)+exp(Z5*a5))*(exp(z1*d1)+exp(z2*d2)+exp(z3*d3)+exp(z4*d4)+exp(z5*d5)), data=data, start = list(b1=.0001,b2=.0001,b3=0,b4=0,b5=0,b6=.00072,b7=0,b8=.00095,a1=-0.0547,a2=0.01,a3=-.149,a4=-.19,a5=-.19,d1=-20,d2=-20,d3=-50,d4=-3,d5=-1)) 

,我得到了以下錯誤:

錯誤qr.qty( QR,resid): 'qr'和'y'必須具有相同的行數

另外:警告消息:

1:在LHS - RHS: 較長物體長度不短對象長度的倍數

2:在.swts * ATTR(右軸, 「梯度」): 較長物體長度不是多個物體的長度較短

我已經搜索了一堆答案,沒有一種情況似乎適用於我,但我承認不知道我做得太好了。任何幫助,將不勝感激!

回答

1

只有6行可以完全吻合。 nls不支持零殘留問題,但如果我們消除除X1X2,Z1Z2之外的所有,那麼我們可以使其工作。我們還使用alg = "plinear"來避免必須提供線性參數的起始值,即參數b。假設你有更多的行,你可能能夠使它工作而不會太多。

Lines <- "STNM Y  X1  X2  X3 X4 X5 X6 X7 X8 Z1 Z2 
A-0071 0.49 216.45 0.00 233.03 17.15 0.00 33.87 6.97 37 0.00 113 
A-0420 0.00 23.88 0.00 39.15 23.85 0.00 0.00 6.91 0 0.00 190 
A-0421 0.01 167.00 114.72 295.03 27.18 4.87 3.62 7.00 2 0.00 132 
A-0436 0.38 216.45 0.00 233.03 17.15 0.00 33.87 6.97 37 0.00 52 
A-0725 0.04 13.94 0.00 22.86 22.86 0.00 0.00 7.07 0 57.41 40 
M-0013 0.00 494.77 549.91 1045.28 1.21 10.31 1.34 6.93 18 0.00 225" 
data <- read.table(text = Lines, header = TRUE) 

# X <- as.matrix(data[3:10]) 
X <- as.matrix(data[3:4]) 
fo <- Y ~ X * (exp(Z1*a1)+exp(Z2*a2)) 
st <- list(a1 = -0.0547, a2 = 0.01) 
fm <- nls(fo, data = data, start = st, alg = "plinear") 

,並提供:

> fm 
Nonlinear regression model 
    model: Y ~ X * (exp(Z1 * a1) + exp(Z2 * a2)) 
    data: data 
     a1   a2 .lin.X1 .lin.X2 
0.0134006 0.0018094 0.0008874 -0.0008142 
residual sum-of-squares: 0.02057 

Number of iterations to convergence: 10 
Achieved convergence tolerance: 6.441e-06