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
相关产品推荐
相关产品推荐

