【问题标题】:Exponential curve fitting with nls using data.table groups使用 data.table 组与 nls 进行指数曲线拟合
【发布时间】:2018-09-25 22:22:53
【问题描述】:

我想将指数曲线拟合到下面显示的数据表中的第 1 组和第 2 组,并获得一个新列,其中包含与每个组对应的残差标准误差。指数曲线应该遵循y=a*exp(b*x)+c

## Example data table
DT <- data.table(
x = c(1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8),
y = c(15.4,16,16.4,17.7,20,23,27,35,25.4,26,26.4,27.7,30,33,37,45),
groups = c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2)

但是,我只知道如何拟合 nls 曲线并使用下面的代码获得单组的残差标准误差,该代码估计了良好的起始参数 abc:

subsetDT <- DT[group == 1]
c.0 <- min(subsetDT[,y]) * 0.5
model.0 <- lm(log(y- c.0) ~ x, data=subsetDT)
start <- list(a=exp(coef(model.0)[1]), b=coef(model.0)[2], c=c.0)
model <- nls(y ~ a * exp(b * x) + c,
         data = subsetDT, start = start, 
         control = nls.control(maxiter=500))
sigma <- summary(model)$sigma

我不想在循环中按组对DT 进行子集化以计算sigma 和其他模型信息。

我知道如果我使用lm,我可以执行以下操作来获取包含模型信息的新列:

DT[, `:=` (r.squared=summary(lm(log(y)~x))$r.squared,
           int=coef(lm(log(y)~x))[1],
           coeff=coef(lm(log(y)~x))[2]
          ), by=c("groups")]

如何使用:= 拟合指数曲线并合并我的nls 参数abc? p>

【问题讨论】:

    标签: r data.table exponential nls


    【解决方案1】:

    如果您希望在原始数据集中添加 sigma、a、b、c 作为新列,您可以执行以下操作:

    DT[, c("sigma", "a", "b", "c") := {
            c.0 <- min(y) * 0.5
            model.0 <- lm(log(y - c.0) ~ x, data=.SD)
            start <- list(a=exp(coef(model.0)[1]), b=coef(model.0)[2], c=c.0)
            model <- nls(y ~ a * exp(b * x) + c,
                data=.SD, 
                start=start, 
                control=nls.control(maxiter=500))
            c(.(sigma=summary(model)$sigma), as.list(coef(model)))
        },
        by=.(groups)]
    

    输出:

        x    y groups     sigma         a         b        c
     1: 1 15.4      1 0.2986243 0.5265405 0.4565363 14.56728
     2: 2 16.0      1 0.2986243 0.5265405 0.4565363 14.56728
     3: 3 16.4      1 0.2986243 0.5265405 0.4565363 14.56728
     4: 4 17.7      1 0.2986243 0.5265405 0.4565363 14.56728
     5: 5 20.0      1 0.2986243 0.5265405 0.4565363 14.56728
     6: 6 23.0      1 0.2986243 0.5265405 0.4565363 14.56728
     7: 7 27.0      1 0.2986243 0.5265405 0.4565363 14.56728
     8: 8 35.0      1 0.2986243 0.5265405 0.4565363 14.56728
     9: 1 25.4      2 0.2986243 0.5265404 0.4565363 24.56728
    10: 2 26.0      2 0.2986243 0.5265404 0.4565363 24.56728
    11: 3 26.4      2 0.2986243 0.5265404 0.4565363 24.56728
    12: 4 27.7      2 0.2986243 0.5265404 0.4565363 24.56728
    13: 5 30.0      2 0.2986243 0.5265404 0.4565363 24.56728
    14: 6 33.0      2 0.2986243 0.5265404 0.4565363 24.56728
    15: 7 37.0      2 0.2986243 0.5265404 0.4565363 24.56728
    16: 8 45.0      2 0.2986243 0.5265404 0.4565363 24.56728
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-15
      • 2016-09-20
      • 2018-06-04
      • 2013-12-04
      • 2020-05-05
      • 2016-02-02
      • 1970-01-01
      • 2018-02-10
      相关资源
      最近更新 更多