使用nls在R中进行多次非线性回归,得到一堆错误

时间:2017-04-08 18:27:46

标签: r regression

我试图按照Nolan和Hitt(2006)的方法来预测硝酸盐浓度(井= STNM,Y =硝酸盐浓度)。以下是我使用的一些预测变量。 X代表氮负荷变量(例如肥料负荷,化粪池),Z代表运输变量(例如土壤Ksat),z代表衰减(例如土壤碳,%湿地)。

这是一个带有非线性乘法项的线性子模型:

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

其中b,a和d是参数。我有8个X变量和参数,5个Z变量和参数,以及5个z变量和参数。下面是我的数据头部的样本(不包括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)中的错误:     &#39; QR&#39;并且&#39; y&#39;必须具有相同的行数

     

另外:警告信息:

     

1:在lhs - rhs中:     较长的物体长度不是较短物体长度的倍数

     

2:在.swts * attr(rhs,&#34;渐变&#34;):     较长的物体长度不是较短物体长度的倍数

我搜索过一堆答案,但似乎没有任何情况适用于我,但我当然不知道我做得太好了。任何帮助,将不胜感激!

1 个答案:

答案 0 :(得分:1)

只有6行,它可以完全适合。 nls不支持零残留问题,但如果我们删除除X1X2Z1Z2之外的所有问题,那么我们就可以使其工作。我们还使用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