楼主: wenO6ZTcp8ct6
114 1

[其他] contdid:连续DID的 R 包手册(0.1.2)与模拟数据用法 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

已卖:30份资源

初中生

95%

还不是VIP/贵宾

-

威望
0 级
论坛币
525 个
通用积分
176.4234
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
530 点
帖子
11
精华
0
在线时间
0 小时
注册时间
2020-9-16
最后登录
2020-9-16

楼主
wenO6ZTcp8ct6 发表于 昨天 10:46 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
contdid:连续DID的 R 包手册(0.1.
2)与模拟数据用法

 

contdid 是 CRAN 上的一个 R 包,做的是"处理强度连续、且实施时点错开"的 DID。作者是 Brantly Callaway、Andrew Goodman-Bacon 与 Pedro
H. C. Sant'Anna,方法出自三人 2025 年的论文,包版本 0.1.2,2026 年 10 月 30 日上架,许可 GPL-3,要求 R 4.1.0 及以上。

 

它和常见的 did 包最大的区别在变量含义:did 包用 gname 表示"哪一期开始处理",而 contdid 用 dname 表示"这一期处理的量"。这个差别决定了整个数据准备方式,也是用错频率最高的地方。

 

数据要长什么样:剂量列必须个体内不变

 

手册对 dname 的要求写得很明确:它是某一期处理的"数量",而且对同一个个体,这个值必须在各个时期保持一致,pre-treatment 时期也一样。gname 仍然是处理起始期,从未参与处理的单位把 gname 设为 0。从未处理单位的剂量在某些应用里可能无法定义,函数会忽略。

 

这条约束听起来别扭,实际含义是:连续 DID 里的"剂量"是个体被暴露的强度(比如补贴比例、覆盖人口占比、政策力度打分),它不随年份变化,变化的是"什么时候开始暴露"。

 

主函数 cont_did 的三组关键参数

 

主函数签名很长,但真正决定研究问题的是三组。

 

第一组是 target_parameter,两个取值:level 报告水平效应,也就是通常说的 ATT;slope 报告斜率效应,也就是 ACRT(平均因果反应),衡量"剂量每增加一单位,结果改变多少"。

 

第二组是 aggregation,三个取值:dose 在时点组与时间上取平均,把结果写成剂量的函数;eventstudy 在时点组与剂量上取平均,把结果写成暴露时长的函数;none 是留给完全拆解结果的占位符,手册明确说目前还不支持。

 

第三组是 dose_est_method,parametric 用 B 样条并假定设定正确,cck 用 npiv 包做数据驱动的非参数估计,方法来自 Chen、Christensen 与 Kankanala 2025 年发表在 Review of Economic Studies 的文章。

 

组合会改变问题本身

 

手册专门用一段提醒:target_parameter 与 aggregation 的组合会显著改变函数行为与分析目标。举的例子很关键,level 配 eventstudy 等价于把处理二值化(只要接受过任何正剂量就算处理组)再跑事件研究。

 

这意味着"我选了事件研究"并不等于"我在做连续处理"。要做真正的连续处理分析,通常要么是 slope 配 dose(看剂量反应曲线),要么是 slope 配 eventstudy(看暴露时长如何改变斜率)。

 

剂量曲线的两种估计

 

parametric 路径下,degree 默认 3,配合默认的 num_knots = 0,等价于在处理组里拟合一个关于剂量的三次多项式;degree 取 1 是线性,取 2 是二次。节点越多越灵活,但有偏误与方差的权衡,手册明确提到这一点。

 

cck 路径不指定函数形式,直接从数据里估剂量反应,代价是需要更大的样本与更多算力,依赖 npiv 的实现。

 

dvals 用来指定在哪些剂量上算效应,不指定时默认取所有曾处理单位剂量的分位数。

 

配套函数:从选节点到画图

 

choose_knots_even 与 choose_knots_quantile 是两个小工具,前者按等距放节点,后者按 x 的分位数放节点,都只接受剂量向量与节点数两个参数。

 

cont_did_acrt 是"在给定一个时点组与一个时期上算剂量效应"的底层函数,主函数内部会调用它;想自己拆解结果或做定制汇总时可以直接用。

 

cont_two_by_two_subset 用来抽出一个 2×2 子样本(指定组 g 与时期 tp),适合核对主函数的中间结果。

 

setup_pte_cont 做估计前的准备,把数据整理成后续要用的结构;ggcont_did 画图,type 取 att 画 ATT(d),取 acrt 画 ACRT(d),返回的是 ggplot 对象。

 

simulate_contdid_data 生成模拟数据,参数是样本量、时期数、组数、剂量线性效应与剂量二次效应,写论文做蒙特卡洛或教学演示都用得上。

 

手册里的示例流程

 

手册自带的例子很完整:先 set.seed(1234),用 simulate_contdid_data 生成 5000 个个体、4 个时期、4 个组、剂量线性与二次效应都为 0 的数据;再调用 cont_did,指定 yname、tname、idname、dname、data 与 gname,选 target_parameter = "slope"、aggregation = "dose"、control_group = "notyettreated",并把 biters 设为 50、cband 设为 TRUE、num_knots 设为
1、degree 设为 3;最后 summary 与 ggcont_did 出结果与图。

 

biters 默认是 1000,示例为了跑得快改成 50。做正式估计时不要沿用示例的 50,自助法次数太少会让置信带不稳。

 

读手册要注意的几处

 

control_group 的默认值在用法行与参数说明里不一致:用法行写 c("notyettreated", "nevertreated", "eventuallytreated"),按 R 的习惯默认取第一个;参数说明的文字却说默认是 nevertreated。以哪一个为准,最好在代码里显式写出来,别依赖默认值。

 

还有几处尚未支持:treatment_type = "discrete" 未支持,aggregation = "none" 未支持,xformula 协变量公式目前也不支持。手册里 allow_unbalanced_panel 的说明提到 att_gt() 会丢掉不在所有时期都出现的单位,这是沿用了 did 包的行为描述,用不平衡面板时要注意样本会被削掉。

 

权重部分也有一处细节值得看:当权重在个体内跨期不变时,各种处理方式结果一致;当权重随时间变化(例如逐年人口规模),平衡面板会用两个时点中较早那一期的权重。

 

版本与引用

 

0.
1.x 版本的接口还在变,升版后参数名与默认值都值得重新读一遍手册。方法本身引用 Callaway、Goodman-Bacon 与 Sant'Anna(2025),包的 DOI 指向 arXiv:2107.02637;写论文时方法与实现要分别引用,软件版本也要写清。

 

────────────────

CRAN 页面、参考手册与 PDF、GitHub 仓库与文档站、论文 DOI、完整参数表与许可条款原文,回复本帖即可见。


游客,如果您要查看本帖隐藏内容请回复

把经管之家装进你常用的 AI 智能体中

一键快捷安装经管之家 MCP/技能,让 AI 帮你查教程、找数据、读论坛帖子。

检索、阅读公开帖子不收费,安装可申请领取:3 通用积分+100 论坛币+3 元论坛资金

请点击查看安装教程与福利 →

说明: AI 算力按所用平台规则计算;附件按原帖条件获取;福利领取条件以活动页面为准。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


沙发
传播学教程62483 发表于 昨天 12:36
剂量列必须个体内不变这条最坑

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-11-14 00:12