You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言nls模型拟合报错:评估时产生缺失值或无穷大

问题解决:非线性拟合的公式错误与参数调整

1. 核心错误:模型公式语法写错了

你写的拟合公式里,把原模型的(log LOEC − a)/b误写成了log(LOEC - a)/b——这直接导致当LOEC <= a时,LOEC - a变成非正数,log运算就会产生NaN,触发报错。这是最关键的问题,不是起始值的锅。

2. 修正后的拟合步骤

步骤1:先把数据整理好

确保数据框正确创建:

LOEC = c(1.15, 1.28, 1.29, 1.30, 1.72, 2.08, 2.18, 2.21, 2.24, 2.24, 2.26, 2.28, 2.37, 2.50, 2.52, 2.60, 2.63, 3.58, 3.91, 3.94, 4.17, 4.29, 4.46, 4.50, 5.29)
PAF = c(0.000385, 0.0769, 0.154, 0.231, 0.308, 0.346, 0.385, 0.410, 0.436, 0.462, 0.487, 0.513, 0.538, 0.554, 0.631, 0.646, 0.692, 0.769, 0.795, 0.846, 0.859, 0.872, 0.897, 0.923, 1)
pol_loec <- data.frame(LOEC, PAF)

步骤2:修正公式+调整细节

原模型是基于log(LOEC)的逻辑斯蒂曲线,另外注意你的PAF里有个值是1,而逻辑斯蒂模型的输出是趋近于1但不会等于1,这可能让拟合出问题,建议把这个值改成0.999:

# 处理PAF=1的情况
pol_loec$PAF[pol_loec$PAF == 1] <- 0.999

# 修正公式,设置合理起始值
# a取log(LOEC中位数),LOEC中位数是2.24,log(2.24)≈0.8;b设为0.5
pol1 <- nls(PAF ~ 1/(1 + exp(-((log(LOEC) - a)/b))),
            data = pol_loec,
            start = c(a=0.8, b=0.5),
            trace=TRUE)

运行这段代码应该就能正常拟合了。

步骤3:查看结果并绘图

查看拟合参数:

summary(pol1)

把拟合曲线加到图里:

library(ggplot2)
pol_loec$pred <- predict(pol1, newdata = pol_loec)

ggplot(pol_loec, aes(x = LOEC, y = PAF)) +
  geom_point() +
  geom_line(aes(y = pred), color = "red", linewidth = 1)

3. 更省心的备选方案:用glm拟合

你的模型本质就是以log(LOEC)为自变量的逻辑斯蒂回归,用广义线性模型(glm)更稳定,还不用手动调起始值:

pol_loec$log_LOEC <- log(pol_loec$LOEC)
glm_fit <- glm(PAF ~ log_LOEC, data = pol_loec, family = binomial(link = "logit"))
pol_loec$glm_pred <- predict(glm_fit, newdata = pol_loec, type = "response")

# 绘图
ggplot(pol_loec, aes(x = LOEC, y = PAF)) +
  geom_point() +
  geom_line(aes(y = glm_pred), color = "blue", linewidth = 1)

拟合结果和nls是一致的,而且更不容易出问题。

内容的提问来源于stack exchange,提问作者William Imart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 10:17:24