【问题标题】:Nonlinear least squares curve fitting in RR中的非线性最小二乘曲线拟合
【发布时间】:2014-09-26 03:47:19
【问题描述】:

我是 R 新手(第一次使用它)。我正在按照本教程http://www.walkingrandomly.com/?p=5254 尝试绘制曲线并发现最适合我的数据的函数。到目前为止,我已经尝试过:

> xdata = c(1 ,5, 10, 20, 100)
> ydata = c(23.83333333, 210.3666667, 545.3666667, 1756.866667, 38595.7)
> plot(xdata,ydata)

所以我明白了:

那我试试:

> p1 = 1
> p2 = 0.2
> fit = nls(ydata ~ xdata^2, start=list(p1=p1,p2=p2))

我得到这个错误:

Error in nlsModel(formula, mf, start, wts) : 
  singular gradient matrix at initial parameter estimates

我做错了什么? 谢谢

【问题讨论】:

    标签: r least-squares


    【解决方案1】:

    nls 函数不会自动包含模型中所有参数的系数。您必须在公式中明确包含它们。我不确定您希望 p1p2 在您的描述中包含在模型中的哪个位置

    p1 <- 1
    p2 <- 0.2
    fit <- nls(ydata ~ p1+p2*xdata^2, start=list(p1=p1,p2=p2))
    fit
    
    # Nonlinear regression model
    #   model: ydata ~ p1 + p2 * xdata^2
    #    data: parent.frame()
    #      p1      p2 
    # 127.216   3.847 
    #  residual sum-of-squares: 21037
    # 
    # Number of iterations to convergence: 1 
    # Achieved convergence tolerance: 5.774e-08
    

    但至少在这种形式下,这仍然是一个线性模型。你可以得到同样的配合

    fit2 <- lm(ydata ~ I(xdata^2))
    fit2
    
    # Call:
    # lm(formula = ydata ~ I(xdata^2))
    # 
    # Coefficients:
    # (Intercept)   I(xdata^2)  
    #     127.216        3.847  
    

    【讨论】:

    • 如何绘制曲线?
    • 绘图是一个完全独立的问题。但如果你有一个合适的模型(fitfit2),你可以使用类似 xs&lt;-seq(min(xdata), max(xdata), length.out=100); plot(xdata,ydata); lines(xs, predict(fit, data.frame(xdata=xs))) 的东西。
    • 拟合值已经在拟合对象中:fitted(fit)fit$m$fitted。只有在提供 newdata 参数时才需要使用 predict。
    • @BondedDust 如果您只是在这里使用拟合值,您将不会得到太多曲线。我正在使用 predict 来估计观察到的 x 值之间的曲线。
    • 在 fit2 示例中,描述我的结果的等式是:y=127.216 + 3.847*x^2 ?
    【解决方案2】:

    为了完整起见,您可以在 ggplot2 框架中包含 Senor O 解决方案,以获取平滑解决方案的图并以图形方式检查解决方案:

    library(ggplot2)
    ggplot(dat,aes(x=xdata,y=ydata)) +
       geom_point() +
       geom_smooth(method="nls", formula=y ~ p1+p2*x^2, se=FALSE, 
                   start=list(p1=p1,p2=p2))
    

    【讨论】:

    • @fredcrs 你在那儿兜圈子
    • 您可以在 R studio 中使用 R markdown 来编织 HTML 或 Word,将所有代码及其输出与绘图一起打印
    【解决方案3】:

    您的公式中没有参数。您需要将它们包括在内,但您认为合适:

    nls(ydata ~ p1 * xdata^2 + p2, start=list(p1=p1,p2=p2))
    

    【讨论】:

      猜你喜欢
      • 2014-03-05
      • 2012-06-29
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 2017-02-24
      • 2012-08-29
      相关资源
      最近更新 更多