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²,公式如下:
从你提供的样本数据来看,模拟值和观测值与1:1线偏差较大,该手动计算的R²会远低于lm()输出的r.squared。r2_1to1 <- 1 - sum((mydata$field - mydata$model)^2) / sum((mydata$field - mean(mydata$field))^2)
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
相关产品推荐
相关产品推荐

