尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Change-in-Change(CIC):双重变化模型在Stata中的实现与TaoToken配置

发布时间:2026/9/26 16:41:55

资讯中心
01
ARTICLE

Change-in-Change(CIC):双重变化模型在Stata中的实现与TaoToken配置

Change-in-Change(CIC):双重变化模型在Stata中的实现与TaoToken配置
1. 从 DID 到 CIC为什么你的政策评估结果可能一直有偏做政策评估的朋友大概率都写过这样的代码reg y treat##post, r然后盯着交互项系数写结论。这套标准 DID 流程在平行趋势成立、处理效应同质的前提下确实够用但现实数据往往不配合。我见过太多面板数据处理组和控制组在政策前的趋势斜率肉眼可见地不一样或者政策对高收入群体的冲击远大于低收入群体——这时候交互项系数只是一个被异质性扭曲的加权平均解释起来非常勉强。Change-in-ChangeCIC模型也叫双重变化模型正是为了解决这个痛点。它由 Athey 和 Imbens 在 2006 年提出核心思路是不再假设处理效应是一个常数而是允许政策在不同分位点上产生不同影响。换句话说DID 关心的是“平均处理效应”CIC 关心的是“处理组结果分布如何整体平移或变形”。如果你的研究问题是“最低工资上调对低收入群体工资分布的影响”或者“环保政策对企业排放分布尾部的影响”CIC 比 DID 更贴合问题本身。这篇文章面向已经会用 Stata 跑 DID、但想进一步掌握 CIC 和 QDID 的实证研究者。我会从识别假设差异讲起给出可直接复制的 do 文件骨架、cic命令的参数配置、模拟数据下的验证步骤以及结果对照方法。过程中涉及的环境配置和 API 调用我会用 TaoToken 来演示方便你在本地快速搭起可复现的分析流程。2. TaoToken 前置把模型调用和 Stata 工作流串起来CIC 本身是 Stata 里的统计命令不需要联网。但实际研究中你往往需要一边跑回归一边查文档、生成模拟数据、或者让模型帮你解释输出结果。这时候一个稳定的 API 入口能省不少事。TaoToken 提供统一的模型调用接口官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点是 https://taotoken.net/api 。你需要先拿到 API Key。进入控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 在 API Keys 页面创建一个新 Key复制保存。这个 Key 后面会用在环境变量里不要直接硬编码进 do 文件。对于长期做编码和 Agent 工作流的用户Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 提供了更稳定的配额方案适合需要反复调用模型生成 Stata 代码片段的场景。如果你只是想快速验证模型输出可以直接用模型对话 https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 页面测试。配置方式很简单在终端里设置环境变量export TAOTOKEN_API_KEY你的API Key export TAOTOKEN_BASE_URLhttps://taotoken.net/apiWindows 用户可以用set命令或者在系统环境变量里添加。设置完成后任何支持自定义 base_url 的客户端都能指向 TaoToken。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有各语言的调用示例。注意API Key 只用于模型调用和 Stata 的cic命令安装无关。Stata 命令通过 SSC 或 GitHub 安装两者不要混淆。3. 可复制配置Stata 中 CIC 与 QDID 的完整 do 文件骨架3.1 安装 cic 命令CIC 的 Stata 实现主要有两个来源SSC 上的cic命令以及作者提供的qd id相关包。先安装ssc install cic, replace ssc install qdid, replace如果 SSC 上没有qdid可以从 GitHub 安装net install qdid, from(https://raw.githubusercontent.com/xxx/qdid/master) replace安装完成后用help cic查看语法。核心命令形式是cic y, group(treat) time(post) [options]其中y是结果变量treat是处理组指示变量0/1post是政策后指示变量0/1。3.2 模拟数据生成为了验证模型先生成一份带异质性处理效应的面板数据clear set seed 20240501 set obs 2000 gen id _n gen treat (runiform() 0.5) gen post (runiform() 0.5) * 生成基础结果变量 gen y0 10 2*treat 3*post rnormal(0, 2) * 引入异质性处理效应处理组在政策后分布整体右移且方差变大 gen te 5 3*runiform() if treat 1 post 1 replace te 0 if te . gen y y0 te * 添加协变量 gen x1 rnormal(0, 1) gen x2 runiform() save cic_simulated.dta, replace这份数据里处理组的处理效应不是常数而是服从一个分布。标准 DID 会给出一个平均效应但 CIC 能刻画出整个分布的变化。3.3 CIC 核心命令与参数配置use cic_simulated.dta, clear * 基础 CIC 估计 cic y, group(treat) time(post) * 带协变量调整 cic y, group(treat) time(post) xvar(x1 x2) * 指定分位点输出 cic y, group(treat) time(post) q(0.1 0.25 0.5 0.75 0.9) * 保存结果 cic y, group(treat) time(post) saving(cic_results.dta, replace)关键参数说明参数作用建议group()指定处理组变量必须是 0/1time()指定政策时间变量必须是 0/1xvar()协变量调整可选但能改善识别q()指定分位点默认输出多个分位saving()保存估计结果方便后续绘图3.4 QDID 的扩展配置QDIDQuantile Difference-in-Differences是 CIC 的延伸直接在分位点上做双重差分qdid y, group(treat) time(post) q(0.25 0.5 0.75)QDID 的识别假设比 CIC 更强一些它要求分位点上的平行趋势成立。实际使用时建议先跑 CIC 看整体分布变化再用 QDID 定位具体分位点的效应。4. 验证请求与成功结果模拟数据下的对照实验4.1 跑通 CIC 并查看输出执行上面的cic命令后Stata 会输出每个分位点上的处理效应估计值。以中位数为例如果模拟数据中处理效应均值约为 6.5CIC 在 0.5 分位点上的估计应该接近这个值但会因分布形态略有偏差。* 完整验证流程 use cic_simulated.dta, clear cic y, group(treat) time(post) q(0.1 0.5 0.9)输出结果会显示类似Quantile CIC Estimate Std. Err. z P|z| 0.10 4.82 0.31 15.5 0.000 0.50 6.47 0.28 23.1 0.000 0.90 8.13 0.35 23.2 0.000可以看到处理效应在低分位点较小、高分位点较大这正是异质性处理效应的体现。如果跑标准 DID交互项系数大约在 6.5 左右会掩盖这种分布差异。4.2 与 DID 结果对照* 标准 DID reg y treat##post, r * 输出交互项系数DID 给出的平均效应约 6.5而 CIC 显示 0.1 分位点效应 4.82、0.9 分位点效应 8.13。如果你的政策问题关心尾部群体DID 的平均效应会严重误导。4.3 用 TaoToken 辅助解读输出跑完回归后可以把结果贴给模型帮你解释。通过 API 调用import os import requests api_key os.environ[TAOTOKEN_API_KEY] base_url os.environ[TAOTOKEN_BASE_URL] headers { Authorization: fBearer {api_key}, Content-Type: application/json } payload { model: claude-3-5-sonnet, messages: [ {role: user, content: CIC估计结果显示0.1分位点效应4.820.5分位点6.470.9分位点8.13请解释这种分布形态的政策含义。} ] } resp requests.post(f{base_url}/v1/messages, jsonpayload, headersheaders) print(resp.json())这样你可以在同一个工作流里完成估计和解读不用来回切换工具。5. 本篇常见错排查CIC 跑不通的六个原因5.1 命令未安装或版本冲突报错command cic not found说明 SSC 安装失败。先检查网络然后手动指定源net install cic, from(https://raw.githubusercontent.com/xxx/cic/master) replace如果之前装过旧版本先ado uninstall cic再重装。5.2 处理组变量不是 0/1cic要求group()和time()都是二值变量。如果处理强度是连续变量需要先离散化gen treat_high (treat_intensity median(treat_intensity))5.3 面板数据未设定CIC 虽然不强制要求xtset但如果有面板结构建议先设定xtset id year否则标准误可能被低估。5.4 分位点估计不收敛当某个分位点上样本量太少时估计会不收敛。检查tab treat post确保四个格子都有足够观测。如果某个格子少于 30 个观测考虑合并分位点或增加数据。5.5 协变量缺失值xvar()里指定的协变量如果有缺失值Stata 会直接丢弃这些观测。先处理缺失misstable summarize x1 x25.6 QDID 与 CIC 结果差异过大如果 QDID 和 CIC 在同一分位点上差异超过 20%说明分位点平行趋势假设可能不成立。这时候优先报告 CIC 结果并在稳健性部分讨论 QDID 的局限性。提示排障时如果涉及 API 调用报错先检查 API Key 是否过期再对照接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 确认请求格式。6. 从估计到复现把 CIC 纳入你的标准分析流程CIC 和 QDID 不是要替代 DID而是给你多一个视角。我的建议是主回归仍然报告 DID 结果但在稳健性部分加入 CIC 的分位点估计尤其是当你的政策问题涉及异质性效应时。这样审稿人问“处理效应是否同质”时你有现成的答案。实际操作中把上面的 do 文件骨架保存成cic_analysis.do每次换数据只需要改use路径和变量名。模拟数据验证通过后再套到真实面板上。如果跑出来某个分位点效应异常大先别急着下结论回头检查那个分位点上的样本量和协变量平衡性。需要长期跑这类分析的话Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 的配额比按次调用更划算。API Keys 管理在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 建议给每个项目单独建 Key方便追踪用量。模型对话入口 https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 适合快速测试提示词确认输出稳定后再写进脚本。最后提醒一句CIC 的识别假设虽然比 DID 宽松但也不是无条件的。它要求处理组和控制组在政策前的“结果分布变化”是可比的这个假设在实证中需要用政策前数据做检验。别跳过这一步。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。