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

R语言拟合幂律函数出现lm.fit的NA/NaN/Inf in 'x'错误如何解决

报错原因

你的Depth列第一个取值为0,对0取对数会得到负无穷(-Inf),线性回归函数无法处理无穷值,因此触发NA/NaN/Inf in 'x'报错。

解决方法

幂律函数的标准形式为 Biomass = a × Depth^b,两边取对数后对应线性关系:log(Biomass) = log(a) + b × log(Depth),拟合完成后对截距取指数即可得到参数a,斜率就是参数b。
你可以根据数据的业务含义选择以下任意一种处理方案:

方案1:剔除Depth=0的观测(推荐)

幂律模型本身适用于自变量大于0的场景,如果Depth=0的观测不属于你的分析范围,可以直接剔除该样本后拟合:

# 剔除Depth为0的行
data_filtered <- data[data$Depth > 0, ]
# 拟合对数转换后的线性模型
model <- lm(log(Biomass) ~ log(Depth), data = data_filtered)
# 查看拟合统计结果
summary(model)
# 提取参数输出幂律方程
a <- exp(coef(model)[1])
b <- coef(model)[2]
cat("拟合幂律方程:Biomass =", round(a, 6), "* Depth^(", round(b, 6), ")")

方案2:添加极小偏移量保留所有样本

如果必须保留Depth=0的观测,可以给所有Depth值加一个不会影响数据分布的极小偏移量,避免取对数得到无穷值:

# 添加极小偏移量
data$Depth <- data$Depth + 1e-9
# 拟合模型
model <- lm(log(Biomass) ~ log(Depth), data = data)
# 查看拟合统计结果
summary(model)
# 提取参数输出幂律方程
a <- exp(coef(model)[1])
b <- coef(model)[2]
cat("拟合幂律方程:Biomass =", round(a, 6), "* Depth^(", round(b, 6), ")")
拟合结果说明

你的样本中Biomass随Depth增加的变化幅度极小,拟合得到的参数b会是一个绝对值很小的负数,和数据趋势一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:21:01