2017-04-08 98 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