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

如何使ggeffects调用实际offset值而非均值(glmmTMB场景)

ggeffects处理Offset的问题及解决方案

问题背景

  • 关于ggeffects包处理offset的资料极少,仅找到一篇对比R与Stata各包处理offset的文章
  • 复现示例后发现,ggpredict()虽基于predict()而非emmeans(),但估计因子变量时仍采用offset的均值
  • 核心需求:实现ggpredict()调用实际offset值,或找到针对glmmTMB对象的替代计算方式(因offset均值与实际值结果差异极大,且存在随机效应与多变量,无法手动计算边际效应)

现有ggpredict输出结果

ggpredict(nb_glm_offset)    
$age
# Predicted counts of claims

age   | Predicted |         95% CI
----------------------------------
<25   |     27.44 | [22.97, 32.78]
25-29 |     24.17 | [20.88, 27.97]
30-35 |     21.30 | [18.51, 24.50]
>35   |     18.04 | [16.21, 20.07]

Adjusted for:
* ln_holders = 4.90

$ln_holders
# Predicted counts of claims

ln_holders | Predicted |             95% CI
-------------------------------------------
         1 |      0.55 | [   0.46,    0.66]
         2 |      1.50 | [   1.26,    1.80]
         3 |      4.09 | [   3.42,    4.88]
         4 |     11.11 | [   9.30,   13.27]
         5 |     30.19 | [  25.28,   36.07]
         6 |     82.08 | [  68.71,   98.05]
         7 |    223.11 | [ 186.77,  266.52]
         9 |   1648.59 | [1380.06, 1969.36]

Adjusted for:
* age = <25

attr(,"class")
[1] "ggalleffects" "list"        
attr(,"model.name")
[1] "nb_glm_offset"

可行解决方法

方法1:让ggpredict调用实际offset值

利用ggpredict()的full.data参数基于原始数据集的所有观测值计算预测值,或通过condition参数手动指定offset的实际取值:

# 基于原始全量数据计算预测值
ggpredict(nb_glm_offset, full.data = TRUE)

# 手动指定offset的实际值(示例中ln_holders为offset变量)
ggpredict(nb_glm_offset, condition = c("age", "ln_holders" = unique(your_data$ln_holders)))

方法2:直接使用glmmTMB的predict函数

绕过ggeffects,直接调用glmmTMB的predict()函数结合原始数据计算,再按需分组统计:

# 加载dplyr用于分组统计
library(dplyr)

# 提取原始数据集
new_data <- your_original_data

# 计算响应尺度的预测值(自动纳入原始offset)
new_data$predicted <- predict(nb_glm_offset, newdata = new_data, type = "response")

# 按age分组计算平均预测值及置信区间
new_data %>%
  group_by(age) %>%
  summarise(
    Predicted = mean(predicted),
    `95% CI lower` = quantile(predicted, 0.025),
    `95% CI upper` = quantile(predicted, 0.975)
  )

方法3:使用emmeans包处理

将offset作为协变量纳入emmeans分析,再转换到响应尺度:

library(emmeans)

# 针对age变量计算边际均值,保留offset协变量
emm_obj <- emmeans(nb_glm_offset, ~ age, cov.keep = "ln_holders")

# 转换到响应尺度并输出结果
emm_response <- regrid(emm_obj, transform = "response")
summary(emm_response)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:15:08