【问题标题】:Multiple nonlinear regression in R using nls, getting a bunch of errors使用nls在R中进行多重非线性回归,得到一堆错误
【发布时间】:2017-09-04 01:28:12
【问题描述】:

我正在尝试按照 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) 中的错误: 'qr' 和 'y' 必须有相同的行数

另外:警告信息:

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

2:在 .swts * attr(rhs, "gradient") 中: 较长的对象长度不是较短对象长度的倍数

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

【问题讨论】:

    标签: r regression


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2012-07-24
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 2022-01-11
      • 2021-03-11
      • 2018-05-20
      相关资源
      最近更新 更多