使用add_predictions()得到的对数模型预测值偏差过大,求原因
问题原因与解决办法
核心原因:预测值是对数转换后的结果,未做反变换
你拟合的模型是log(standard_conc_ngul) ~ ct,模型学习的是ct对standard_conc_ngul对数的线性关系。add_predictions()默认输出的是模型预测的对数转换后的值,而非原始浓度值。直接拿这个对数结果和原始的standard_conc_ngul对比,数值量级完全不同,自然偏差极大。快速验证方式
查看添加的预测列,数值应该是较小的负数或正数(对应原始浓度的对数),和原始浓度的量级差异明显。比如原始浓度为100ng/ul时,对数后约为4.6,用4.6和100对比肯定会出现巨大偏差。解决办法:对预测值做指数反变换
先通过add_predictions()得到对数预测值,再用mutate()计算指数转换后的原始浓度预测值。示例代码:
library(tidyverse) library(modelr) # 假设你的模型名为mod,数据集名为df df_with_pred <- df %>% add_predictions(mod, var = "log_conc_pred") %>% mutate(conc_pred = exp(log_conc_pred))
此时conc_pred才是对应原始standard_conc_ngul的预测值,和实际值对比会吻合模型的拟合效果。
- 可选优化:偏差校正
如果模型假设是对数正态分布,直接指数转换可能存在轻微偏差(因为E[exp(Y)] ≠ exp(E[Y]),其中Y为对数变量)。若需要更精准的预测,可添加残差方差的校正项:
# 提取模型残差方差 resid_var <- sigma(mod)^2 df_with_pred <- df_with_pred %>% mutate(conc_pred_corrected = exp(log_conc_pred + resid_var / 2))
不过你的模型R²高达0.97,这个校正的影响极小,多数场景下直接指数转换即可满足需求。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

