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

R语言非线性模型拟合优度:nls()是否有R²类拟合统计量及相关包实现?

关于nls()非线性回归的拟合优度统计量

好问题!线性回归里的R²确实没法直接照搬到非线性回归场景——毕竟非线性模型没有线性模型里“解释变异占总变异比例”的严格定义,但我们有几个实用的替代统计量可以用来评估拟合程度,也有现成的R包能帮你计算:

  • 伪R²(Pseudo-R²):这是最常用的替代指标,核心思路和R²类似,计算方式为 1 - (残差平方和RSS / 总平方和TSS)。虽然它的解释性不如线性R²严谨,但可以作为不同模型拟合效果的相对参考。你可以手动计算,也可以用rcompanion包的nagelkerke()函数来自动计算(该函数原本针对广义线性模型,但也支持nls对象);另外fmsb包的NagelkerkeR2()也能实现类似功能。

  • McFadden's R²:这个指标原本用于逻辑回归,但也适配非线性模型,它通过比较目标模型的对数似然与零模型(仅含截距的模型)的对数似然来衡量拟合提升,公式为 1 - (logLik(model) / logLik(null_model))。同样可以用rcompanion包计算,不过需要先拟合对应的零模型。

  • 信息准则(AIC/BIC):虽然不属于R²类统计量,但AIC和BIC是比较非线性模型优劣的常用指标——值越小说明模型拟合效果越好且更简洁。nls拟合的模型可以直接用AIC(model)和BIC(model)来计算。

你提到的nlstools包确实侧重模型诊断(比如残差可视化、参数置信区间计算等),没有内置R²类统计量,但可以结合上面提到的包来补充这部分功能。

给你一个快速上手的示例代码:

# 生成示例数据
set.seed(123)
x <- seq(0, 10, length.out = 50)
y <- 2 * exp(-0.3*x) + rnorm(50, 0, 0.2)

# 拟合非线性模型
fit <- nls(y ~ a * exp(-b*x), start = list(a=2, b=0.3))

# 手动计算伪R²
rss <- sum(residuals(fit)^2)
tss <- sum((y - mean(y))^2)
pseudo_r2 <- 1 - rss/tss
cat("手动计算的伪R²:", round(pseudo_r2, 3), "\n")

# 用rcompanion包计算Nagelkerke伪R²
library(rcompanion)
# 拟合零模型(仅包含均值)
null_fit <- nls(y ~ mu, start = list(mu = mean(y)))
nagelkerke(fit, null = null_fit)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:06:01