我试图按照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;): 较长的物体长度不是较短物体长度的倍数
我搜索过一堆答案,但似乎没有任何情况适用于我,但我当然不知道我做得太好了。任何帮助,将不胜感激!
答案 0 :(得分:1)
只有6行,它可以完全适合。 nls
不支持零残留问题,但如果我们删除除X1
,X2
,Z1
和Z2
之外的所有问题,那么我们就可以使其工作。我们还使用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