连续变量观测值变化追踪:美国某县财产税避税行为实证分析的数据编码方案咨询
监测财产税政策下的房产拆分避税行为:Stata编码方案
看起来你已经抓住了核心识别逻辑——追踪同一总规划(masterplan)下房产编号(lotnumber)和面积(area)在政策前后的变化,下面我会一步步帮你实现这个监测流程,完全贴合你提供的数据集结构来设计:
第一步:数据预处理(先把变量转成可用格式)
你的数据里area和transactiondate都是字符串类型,首先得转换成Stata能处理的数值和日期格式,还要清理掉lotnumber里的多余空格:
* 清理lotnumber的首尾空格 replace lotnumber = trim(lotnumber) * 将面积从字符串转为数值型 destring area, replace ignore(",") // 如果面积有逗号分隔符就加ignore,没有可直接删掉该参数 drop if missing(area) // 删掉面积缺失的观测 * 将交易日期转为Stata日期格式 gen transaction_date = date(transactiondate, "YMD") format transaction_date %tdCCYY/NN/DD // 格式化日期显示为易读格式 drop if missing(transaction_date) // 删掉日期缺失的观测
第二步:定义政策时间节点
首先你需要明确政策宣布/实施的具体日期(比如假设是2003年1月1日,你替换成研究中实际的政策日期即可),生成一个政策前后的标记变量:
* 替换成你研究中政策实际生效的日期 local policy_date = date("2003/01/01", "YMD") gen post_policy = (transaction_date >= `policy_date') label define policy 0 "政策前" 1 "政策后" label values post_policy policy
第三步:核心识别逻辑——捕捉两种拆分场景
根据你的描述,拆分行为主要有两种表现,我们分别编码识别:
场景1:同一基础房产编号拆分(比如原lot 261 → 261/2)
很多拆分后的房产会在原编号后加后缀(如/2),所以先提取基础编号,再追踪同一基础编号下的面积变化:
* 提取基础lot编号(去掉/及后面的所有内容) gen base_lot = regexr(lotnumber, "/.*", "") destring base_lot, replace // 转成数值型方便分组统计 * 按总规划+基础编号分组,计算政策前的最大面积 bysort masterplan base_lot: egen pre_max_area = max(area) if !post_policy bysort masterplan base_lot: replace pre_max_area = pre_max_area[1] // 组内填充所有观测的政策前最大面积 * 标记可能的拆分:政策后面积<500,且政策前该基础编号的房产面积>500 gen split_type1 = (post_policy & area < 500 & pre_max_area > 500)
场景2:原大房产消失,新增多个小房产
有些拆分可能直接用全新的lot编号,这时候需要对比同一总规划下政策前后的房产面积分布:
* 先标记政策前存在的超阈值房产 gen pre_large_lot = (!post_policy & area > 500) * 按总规划分组,标记是否有政策前的大房产 bysort masterplan: egen has_pre_large = max(pre_large_lot) * 标记政策后新增的小房产(且所在总规划曾有大房产) gen split_type2 = (post_policy & area < 500 & has_pre_large == 1) * 进阶验证:拆分后总面积是否接近原大房产(可选,排除非拆分的新增小房产) bysort masterplan post_policy: egen total_area = sum(area) bysort masterplan: egen pre_total_large = total_area if !post_policy bysort masterplan: replace pre_total_large = pre_total_large[1] * 只保留拆分后总面积接近原大房产的案例(误差范围可自行调整,这里设为5%) replace split_type2 = 0 if abs(total_area - pre_total_large) > pre_total_large * 0.05
第四步:验证与分析
完成编码后,你可以通过以下方式检查结果:
- 查看所有标记为拆分的案例:
list masterplan lotnumber area transaction_date if split_type1 | split_type2
- 统计政策前后超阈值房产的数量变化:
tab post_policy if area > 500
- 绘制趋势图,直观观察政策前后超阈值房产的时间变化:
* 按日期统计超阈值房产数量 bysort transaction_date: egen large_lot_count = sum(area > 500) * 绘制趋势图,红色虚线标记政策生效日期 twoway (line large_lot_count transaction_date), /// title("超500平方米房产数量变化") /// ytitle("数量") xtitle("日期") /// vertical line(`policy_date', lcolor(red) lpattern(dash)) /// legend(off)
额外提示
- 如果你的数据集有房产所有者信息(比如
owner_id),可以加入分组条件,进一步确认拆分前后的所有者是否一致,排除非避税的拆分(如房产出售、继承)。 - 注意
masterplan的格式是否统一(比如示例里的/2022),如果有不同格式的总规划编号,需要先统一清理。
内容的提问来源于stack exchange,提问作者nesta13
相关产品推荐
相关产品推荐

