代码之家  ›  专栏  ›  技术社区  ›  NewUsr_stat

nls和rational函数的开始参数列表

nls r
  •  0
  • NewUsr_stat  · 技术社区  · 7 年前

    数据:

     [1] 2.000000 3.000000 2.333333 1.750000 2.000000 1.833333 2.416667  1.916667
     [9] 1.750000 2.166667 2.116667 1.916667 1.944444 1.611111 1.722222 1.777778
    [17] 1.877778 1.944444 1.958333 1.833333 2.041667 2.020833 1.908333 1.916667
    [25] 1.733333 1.833333 1.800000 1.933333 1.893333 1.866667 1.888889 1.805556
    [33] 1.833333 1.847222 1.822222 1.805556 1.833333 1.904762 1.880952 1.833333
    [41] 1.804762 1.809524 1.708333 1.708333 1.750000 1.708333 1.683333 1.687500
    [49] 1.611111 1.666667 1.648148 1.611111 1.611111 1.611111 1.650000 1.600000
    [57] 1.650000 1.625000 1.630000 1.616667 1.469697 1.560606 1.590909 1.651515
    [65] 1.651515 1.651515 1.513889 1.555556 1.625000 1.638889 1.647222 1.652778
    [73] 1.679487 1.717949 1.705128 1.698718.   
    

    我希望适合的模型如下:

    Model <- function(t, a, b, c, d) {
                     (a + b*t)/(1 + c*t + d*t^2)
     }
    

    我知道我首先要给出一个a,b,c的开始列表。。。对于nls,但我真的不知道如何设置参数。因为我不是这方面的专家 http://www.css.cornell.edu/faculty/dgr2/teach/R/R_rat.pdf 记录一份有用的指南。但在某种程度上,它说:

    最好的

    E

    2 回复  |  直到 7 年前
        1
  •  3
  •   G. Grothendieck    7 年前

    问题中未完全规定模型,但假设以下代码中的模型以及以下注释2中重复显示的数据,如果我们设置c=d=0,则该模型为线性模型,因此我们可以使用线性模型拟合的系数作为起始值:

    fm1 <- lm(y ~ t)
    st2 <- list(a = coef(fm1)[[1]], b = coef(fm1)[[2]], c = 0, d = 0)
    fm2 <- nls(y ~ Model(t, a, b, c, d), start = st2)
    

    给:

    > fm2
    Nonlinear regression model
      model: y ~ Model(t, a, b, c, d)
       data: parent.frame()
            a         b         c         d 
    2.5097712 0.6038808 0.3205409 0.0008663 
     residual sum-of-squares: 1.684
    
    Number of iterations to convergence: 16 
    Achieved convergence tolerance: 8.029e-06
    

    以图形方式查看配合:

    # model is shown in red. See Note 1 for fm4 (blue) and fm5 (green) models.
    plot(y ~ t)
    lines(fitted(fm2) ~ t, col = "red")
    lines(fitted(fm4) ~ t, col = "blue")
    lines(fitted(fm5) ~ t, col = "green")
    legend("topright", c("fm2", "fm4", "fm5"), col = c("red", "blue", "green"), lty = 1)
    

    screenshot

    附注1

    下面是一个不同的模型,它几乎同样适用,但只使用了3个参数。见上图中的蓝线。

    fm3 <- lm(log(y) ~ log(t))
    st4 <- list(a = coef(fm3)[[1]], b = 0, c = coef(fm3)[[2]])
    fm4 <- nls(y ~ exp(a + b/t + c*log(t)), start = st4)
    
    > fm4
    Nonlinear regression model
      model: y ~ exp(a + b/t + c * log(t))
       data: parent.frame()
          a       b       c 
     0.9845 -0.1767 -0.1157 
     residual sum-of-squares: 1.685
    
    Number of iterations to convergence: 4 
    Achieved convergence tolerance: 2.625e-06
    

    而且这个型号还不错。它只使用了两个参数,其中是线性的,其残差平方和为1.728837,而fm2模型为1.684,fm4模型为1.685。见上图中的绿线。

    fm5 <- lm(y ~ log(t))
    
    > fm5
    
    Call:
    lm(formula = y ~ log(t))
    
    Coefficients:
    (Intercept)       log(t)  
         2.4029      -0.1793  
    
    > deviance(fm5)
    [1] 1.728837
    

    附注2

    y <- c(2, 3, 2.333333, 1.75, 2, 1.833333, 2.416667, 1.916667, 1.75, 
    2.166667, 2.116667, 1.916667, 1.944444, 1.611111, 1.722222, 1.777778, 
    1.877778, 1.944444, 1.958333, 1.833333, 2.041667, 2.020833, 1.908333, 
    1.916667, 1.733333, 1.833333, 1.8, 1.933333, 1.893333, 1.866667, 
    1.888889, 1.805556, 1.833333, 1.847222, 1.822222, 1.805556, 1.833333, 
    1.904762, 1.880952, 1.833333, 1.804762, 1.809524, 1.708333, 1.708333, 
    1.75, 1.708333, 1.683333, 1.6875, 1.611111, 1.666667, 1.648148, 
    1.611111, 1.611111, 1.611111, 1.65, 1.6, 1.65, 1.625, 1.63, 1.616667, 
    1.469697, 1.560606, 1.590909, 1.651515, 1.651515, 1.651515, 1.513889, 
    1.555556, 1.625, 1.638889, 1.647222, 1.652778, 1.679487, 1.717949, 
    1.705128, 1.698718)
    
    t <- seq_along(y)
    
        2
  •  0
  •   mickey    7 年前

    nls(y ~ (a1 + b1*times) / (1 + c1*times + d1*times^2))
    

    哪里 y 是您提供的上述数据,以及 times=1:76 1 参数,因为 nls 不认识 c c()

    然而,当我运行这个时,我得到一个错误 singular gradient 并建议将起始值初始化为除 (默认设置)。可以使用参数指定起始值 start = list("a1"=0.1, "b1"=0.1, "c1"=0.1, "d1"=0.1)