R语言nls拟合Logistic生长曲线报错如何解决
Logistic曲线nls拟合报错问题

使用ggplot完成数据绘制后得到上述结果,目标是为图中每条曲线拟合对应函数。
最初使用nls函数开展拟合时,深蓝色曲线拟合失败,曲线形态与预期偏差明显。考虑到数据呈现sigmoid(S型)曲线特征,改用Logistic函数拟合,仍未成功。初始参数设置的拟合代码如下:
start.values <- list(gm=0.6, k=0.8) nls4 = nls(growth_rate ~ gm/(1+(exp(-0.8*(quantity-k)))), data = pr28S, start=start.values)
代码参数说明:
gm:曲线的渐近最大值k:S型曲线中点对应的x轴取值- 固定值0.8:Logistic生长速率参数
- 模型自变量(x轴):
quantity - 模型因变量(y轴):
growth_rate
测试过程中多次调整初始参数,将固定的速率参数0.8在0.5~2区间内遍历取值,始终无法完成拟合,出现两类报错:
Error in nls(growth_rate ~ gm/(1 + (exp(-0.8 * (quantity - k)))), data = pr28S, :
the step 0.000488281 is lower than'minFactor' of 0.000976562'
以及奇异梯度报错:singular gradient
需要明确参数或代码调整方法,实现Logistic曲线的正确拟合。
补充:28S曲线对应数据集
structure(list(name = c("J4_S01AC", "J4_S01CC", "J4_S01EC", "J4_S01FC", "J4_S03BC", "J4_S03CC", "J4_S03DC", "J4_S03EC", "J4_S03FC", "J4_S06AC", "J4_S06DC", "J4_S06EC", "J4_S06FC", "J4_S06KC", "J4_S06MC", "J4_S06NC", "J4_S09AC", "J4_S09BC", "J4_S09CC", "J4_S09DC", "J4_S03AM", "J4_S03BM", "J4_S03CM", "J4_S15AM", "J4_S15BM", "J4_S15CM", "J4_S15DM", "J4_S01AAC" ), day = c("J4", "J4", "J4", "J4", "J4", "J4", "J4", "J4", "J4", "J4", "J4", "J4", "J4", "J4", "J4", "J4", "J4", "J4", "J4", "J4", "J4", "J4", "J4", "J4", "J4", "J4", "J4", "J4"), quality = c("S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S"), quantity = c(0.1, 0.1, 0.1, 0.1, 0.3, 0.3, 0.3, 0.3, 0.3, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.9, 0.9, 0.9, 0.9, 0.3, 0.3, 0.3, 1.5, 1.5, 1.5, 1.5, 0.1), qual_quant = c("S01", "S01", "S01", "S01", "S03", "S03", "S03", "S03", "S03", "S06", "S06", "S06", "S06", "S06", "S06", "S06", "S09", "S09", "S09", "S09", "S03", "S03", "S03", "S15", "S15", "S15", "S15", "S01"), temperature = c(28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28), time = c(101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 102, 102, 102, 102, 107.5, 107.5, 107.5, 107.5, 107.5, 107.5, 107.5, 109), size = c(1344.366, 1291.962, 1304.811, 1128.264, 1286.151, 1358.421, 1396.671, 1353.076, 1505.565, 1297.17, 0, 1243.029, 1323.85, 1368.364, 1506.396, 0, 1663.735, 1632.28, 2115.303, 1921.46, 1506.581, 1501.196, 1370.99, 1870.489, 1941.425, 1942.186, 1827.395, 1336.588), weight = c(11, 16, 10, 10, 12, 12, 13, 16, 14, 12, 11, 12, 10, 10, 15, 25, 46, 35, 66, 46, 20, 16, 15, 49, 73, 63, 60, 11), growth_rate = c(0.0378568479840844, 0.126892202895244, 0.0152090656484838, 0.0152090656484838, 0.0585326533474545, 0.0585326533474545, 0.0775525505364441, 0.126892202895244, 0.0951622248242906, 0.0585326533474545, 0.0378568479840844, 0.0585326533474545, 0.0152090656484838, 0.0152090656484838, 0.111556439370444, 0.232939774941222, 0.374129156018743, 0.309825356331568, 0.459072793066665, 0.374129156018743, 0.169037347727828, 0.119219651092275, 0.104811166292231, 0.369092608582107, 0.458090402952369, 0.425199566970549, 0.414306966296783, 0.0350783637283718), color = c("28S", "28S", "28S", "28S", "28S", "28S", "28S", "28S", "28S", "28S", "28S", "28S", "28S", "28S", "28S", "28S", "28S", "28S", "28S", "28S", "28S", "28S", "28S", "28S", "28S", "28S", "28S", "28S")), row.names = c(NA, -28L), class = c("tbl_df", "tbl", "data.frame"))
内容的提问来源于stack exchange,提问作者Nate Trf
相关产品推荐
相关产品推荐

