R 带nls的循环函数

R 带nls的循环函数,r,loops,curve-fitting,nls,R,Loops,Curve Fitting,Nls,我正在努力循环nls函数。这里是一个单一样本的示例数据集 dat<-read.table(text="time y 1 4.62 2 13.55 3 30.82 6 93.97 12 145.93 24 179.93", header = TRUE) plot(data);lines(data) model <- nls(y ~ Max * (1-exp(-k * (time - Lag))),data=dat,start=list(Max = 200, k =

我正在努力循环nls函数。这里是一个单一样本的示例数据集

dat<-read.table(text="time y
1 4.62
2 13.55
3 30.82
6 93.97
12 145.93
24 179.93", header = TRUE)
plot(data);lines(data)
model <- nls(y ~ Max * (1-exp(-k * (time - Lag))),data=dat,start=list(Max = 200, k = 0.1, Lag = 0.5))

对于每个样本(gluc、Sitch、solka),我如何让R求解
Max
k
Lag

构建要用作字符串的公式:

outcomes = c("gluc", "starch", "solka")
my_formulas = paste(outcomes, "~ Max * (1-exp(-k * (time - Lag)))")
model_list = list()

for(i in seq_along(outcomes)) {
  model_list[[outcomes[i]]] = nls(
    as.formula(my_formulas[i], 
    data = dat,
    start = list(Max = 200, k = 0.1, Lag = 0.5)
  )
}

这将创建一个模型列表,您可以访问,例如,
summary(model_list[[1]])
summary(model_list[[“solka”]])

构建要用作字符串的公式:

outcomes = c("gluc", "starch", "solka")
my_formulas = paste(outcomes, "~ Max * (1-exp(-k * (time - Lag)))")
model_list = list()

for(i in seq_along(outcomes)) {
  model_list[[outcomes[i]]] = nls(
    as.formula(my_formulas[i], 
    data = dat,
    start = list(Max = 200, k = 0.1, Lag = 0.5)
  )
}

这将创建一个模型列表,您可以访问,例如,
summary(model_list[[1]])
summary(model_list[[“solka”]])

在下面的所有备选方案中,我们使用这些值:

long <- tidyr::pivot_longer(dat, -1, values_to = "y")
long$name <- factor(long$name)
st0 <- list(Max = 200, k = 0.1, Lag = 0.5)
给予:

Nonlinear regression model
  model: y ~ Max[name] * (1 - exp(-k[name] * (time - Lag[name])))
   data: long
     Max1      Max2      Max3        k1        k2        k3      Lag1      Lag2 
306.48737 389.84657 361.82290   0.12214   0.03857   0.13747   1.38072   2.02205 
     Lag3 
  1.31770 
 residual sum-of-squares: 7167

Number of iterations to convergence: 8 
Achieved convergence tolerance: 9.186e-06
ggplot2图形可以这样做

library(ggplot2)
fitdf <- transform(long, fit = fitted(model))
ggplot(fitdf, aes(x = time, y = y, color = name)) +
    geom_point() +
    geom_line(aes(y = fit))
2)nlsList如果您不需要调查名称中参数的常见设置,那么另一种可能是在nlme包中使用
nlsList
(它随R提供,因此您不必安装它)
long
st0
来自上面

library(nlme)
fit <- nlsList(y ~ Max * (1-exp(-k * (time - Lag))) | name, long, start = st0)
我们可以绘制数据并拟合:

levs <- levels(long$name)
col <- setNames(rainbow(length(levs)), levs) 
plot(y ~ time, long, col = col[name], pch = 20, cex = 1.5)
for(lv in levs) lines(fitted(fit[[lv]]) ~ time, dat, col = col[lv])
legend("bottomright", leg = levs, col = col, pch = 20, cex = 1.5)

(2)中的图形代码也适用于此处。

在下面的所有备选方案中,我们使用这些值:

long <- tidyr::pivot_longer(dat, -1, values_to = "y")
long$name <- factor(long$name)
st0 <- list(Max = 200, k = 0.1, Lag = 0.5)
给予:

Nonlinear regression model
  model: y ~ Max[name] * (1 - exp(-k[name] * (time - Lag[name])))
   data: long
     Max1      Max2      Max3        k1        k2        k3      Lag1      Lag2 
306.48737 389.84657 361.82290   0.12214   0.03857   0.13747   1.38072   2.02205 
     Lag3 
  1.31770 
 residual sum-of-squares: 7167

Number of iterations to convergence: 8 
Achieved convergence tolerance: 9.186e-06
ggplot2图形可以这样做

library(ggplot2)
fitdf <- transform(long, fit = fitted(model))
ggplot(fitdf, aes(x = time, y = y, color = name)) +
    geom_point() +
    geom_line(aes(y = fit))
2)nlsList如果您不需要调查名称中参数的常见设置,那么另一种可能是在nlme包中使用
nlsList
(它随R提供,因此您不必安装它)
long
st0
来自上面

library(nlme)
fit <- nlsList(y ~ Max * (1-exp(-k * (time - Lag))) | name, long, start = st0)
我们可以绘制数据并拟合:

levs <- levels(long$name)
col <- setNames(rainbow(length(levs)), levs) 
plot(y ~ time, long, col = col[name], pch = 20, cex = 1.5)
for(lv in levs) lines(fitted(fit[[lv]]) ~ time, dat, col = col[lv])
legend("bottomright", leg = levs, col = col, pch = 20, cex = 1.5)

(2)中的图形代码在这里也起作用。

melt
data.frame并使用包nlme中的
nlsList
melt
data.frame并使用包nlme中的
nlsList