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

R语言中使用lm()计算模型R²是否适配观测值与模拟值拟合场景

R²与BIAS计算相关问题解答

lm()输出r.squared的适用性说明

你当前使用lm(data = mydata, field ~ model)得到的r.squared是否适用,取决于你的使用场景:

  • 如果你仅需要衡量实地观测值和模型模拟值的线性相关程度,该结果是适用的。lm()默认拟合带截距、斜率的最优线性关系,其输出的r.squared反映了观测值的变异能被该线性关系解释的比例。
  • 如果你需要评估模型模拟值和观测值的1:1吻合程度(即模型模拟的准确性,而非仅线性相关性),则不能直接使用该结果。因为lm()拟合的是最优线性线,而非我们验证模型时常用的截距为0、斜率为1的1:1参考线,此时你需要手动计算对应R²,公式如下:
    r2_1to1 <- 1 - sum((mydata$field - mydata$model)^2) / sum((mydata$field - mean(mydata$field))^2)
    
    从你提供的样本数据来看,模拟值和观测值与1:1线偏差较大,该手动计算的R²会远低于lm()输出的r.squared。

BIAS值的计算方法

BIAS(平均偏差)不需要依赖lm()的输出,直接通过观测值和模拟值计算即可,常用两种计算形式:

  • 绝对BIAS:单位和数据本身一致,正数值代表模型整体高估观测值,负数值代表整体低估
    bias_abs <- mean(mydata$model - mydata$field)
    
  • 相对BIAS:以百分比形式呈现,便于跨量级数据的偏差比较
    bias_rel <- mean((mydata$model - mydata$field)/mydata$field) * 100
    

完整计算示例代码

# 拟合线性模型
fit <- lm(field ~ model, data = mydata)
# 提取lm默认输出的R²
r2_lm <- summary(fit)$r.squared
# 计算1:1线对应的R²
ss_res <- sum((mydata$field - mydata$model)^2)
ss_tot <- sum((mydata$field - mean(mydata$field))^2)
r2_1to1 <- 1 - ss_res/ss_tot
# 计算两类BIAS
bias_abs <- mean(mydata$model - mydata$field)
bias_rel <- mean((mydata$model - mydata$field)/mydata$field) * 100

# 输出所有结果
print(paste0("lm默认R²: ", round(r2_lm, 3)))
print(paste0("1:1线对应R²: ", round(r2_1to1, 3)))
print(paste0("绝对BIAS: ", round(bias_abs, 3)))
print(paste0("相对BIAS: ", round(bias_rel, 1), "%"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:39:03