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

R语言指数lm()模型出现lm.fit()错误的技术问询

解决指数回归拟合时的数值溢出错误及分组绘图方案

错误原因

你的代码报错是因为x中存在极大值(如765.018),计算exp(x)时超出了R的浮点数表示范围,产生了无穷大(Inf),导致线性模型lm()无法处理无效数值。验证这一点可以运行:

max(df$x)          # 输出约765.018
exp(max(df$x))     # 输出Inf,超出数值上限

正确的指数回归拟合方式

你想要的指数回归通常指模型形式:( y = ae^{bx} ),直接对x取指数作为自变量的方式不仅会导致数值溢出,也不符合标准指数回归的设定。正确做法是对模型两边取自然对数,转换为线性模型:
[ \log(y) = \log(a) + bx ]
这样既避免了数值溢出,又能用线性模型拟合,之后再转换回原始y的刻度即可。

方案1:分组拟合+手动预测绘图

library(tidyverse)

# 按Type_stat分组拟合对数线性模型,并生成预测值
df_pred <- df %>%
  group_by(Type_stat) %>%
  nest() %>%
  mutate(
    model = map(data, ~ lm(log(y) ~ x, data = .x)),
    pred_data = map2(data, model, ~ tibble(x = .x$x, y_pred = exp(predict(.y))))
  ) %>%
  unnest(c(data, pred_data))

# 绘制原始点+拟合曲线
ggplot(df_pred, aes(x = x, color = Type_stat)) +
  geom_point(aes(y = y)) +
  geom_line(aes(y = y_pred), linetype = 1) +
  theme_minimal()

方案2:直接用ggplot的glm方法(更简洁)

利用广义线性模型(GLM)的对数链接函数,无需手动转换,ggplot会自动处理拟合和绘图:

library(tidyverse)

ggplot(df, aes(x = x, y = y, color = Type_stat)) +
  geom_point() +
  geom_smooth(
    method = "glm",
    method.args = list(family = gaussian(link = "log")),
    se = FALSE,
    linetype = 1
  ) +
  theme_minimal()

注意事项

  • 确保你的y值均为正数(你的数据满足这一点),否则取对数会产生NA;如果存在y=0的情况,可以改用y ~ exp(x)的变体或调整模型(如加入小常数)。
  • 两种方案的拟合结果本质一致,第二种更适合快速绘图,第一种适合需要提取模型参数的场景。

内容的提问来源于stack exchange,提问作者C. Guff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 02:48:29