使用 data.table 组对 nls 进行指数曲线拟合
Exponential curve fitting with nls using data.table groups
我想将指数曲线拟合到下面显示的数据 table 中的第 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 曲线并使用下面的代码获得单组的残差标准误差,该代码估计良好的起始参数 a, b, 和 c:
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 参数 a、b 和 c?
如果您要在原始数据集中添加 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
我想将指数曲线拟合到下面显示的数据 table 中的第 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 曲线并使用下面的代码获得单组的残差标准误差,该代码估计良好的起始参数 a, b, 和 c:
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 参数 a、b 和 c?
如果您要在原始数据集中添加 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