在 Stata 中进行加权热卡插补的简单方法?
Simple way to do a weighted hot deck imputation in Stata?
我想在 Stata 中做一个简单的加权热卡插补。在 SAS 中,等效命令如下(请注意,这是一个较新的 SAS 功能,从 2015 年左右的 SAS/STAT 14.1 开始):
proc surveyimpute method=hotdeck(selection=weighted);
为清楚起见,基本要求是:
插补大多数是基于行的或同时的。如果第 1 行捐赠 x
到第 3 行,那么它也必须捐赠 y
.
必须考虑权重。权重为 2 的捐赠者 selected 的可能性应该是权重为 1
的捐赠者的两倍
我假设缺失的数据是矩形的。换句话说,如果可能缺失的变量集由 x
和 y
组成,则要么两者都缺失,要么两者都不缺失。下面是生成示例数据的一些代码。
global miss_vars "wealth income"
global weight "weight"
set obs 6
gen id = _n
gen type = id > 3
gen income = 5000 * _n
gen wealth = income * 4 + 500 * uniform()
gen weight = 1
replace weight = 4 if mod(id-1,3) == 0
// set income & wealth missing every 3 rows
gen impute = mod(_n,3) == 0
foreach v in $miss_vars {
replace `v' = . if impute == 1
}
数据如下所示:
id type income wealth weight impute
1. 1 0 5000 20188.03 4 0
2. 2 0 10000 40288.81 1 0
3. 3 0 . . 1 1
4. 4 1 20000 80350.85 4 0
5. 5 1 25000 100378.8 1 0
6. 6 1 . . 1 1
所以换句话说,我们需要随机(加权)select一个供体相同类型对每一行有缺失值的观察并使用那个供体填写收入和财富值。在实际使用中类型变量的生成当然是它自己的问题,但我在这里保持非常简单以专注于主要问题。
例如,第 3 行可能类似于以下任一 post hotdeck(因为它填充了第 1 行或第 2 行的收入和财富(但相反,它永远不会从第 1 行获取收入以及第 2 行的财富):
3. 3 0 5000 20188.03 1 1
3. 3 0 10000 40288.81 1 1
此外,由于第 1 行的权重为 4,第 2 行的权重为 1,因此第 1 行应该有 80% 的时间是供体,而第 2 行应该有 20% 的时间是供体。
似乎在 Stata 中没有办法做到这一点,也没有社区提供的命令。有一些社区贡献的命令可以执行 hotdecks(具体来说,hotdeck、whotdeck、 和 hotdeckvar),但其中 none 处理样本权重. whotdeck 命令表面上似乎可以处理权重,但这些不是样本权重,而是内部估计的重要性权重。
于是自己写了一个程序上传到github。它被称为wtd_hotdeck。请关注 link 以获取更多信息和任何后续更新。
我想在 Stata 中做一个简单的加权热卡插补。在 SAS 中,等效命令如下(请注意,这是一个较新的 SAS 功能,从 2015 年左右的 SAS/STAT 14.1 开始):
proc surveyimpute method=hotdeck(selection=weighted);
为清楚起见,基本要求是:
插补大多数是基于行的或同时的。如果第 1 行捐赠
x
到第 3 行,那么它也必须捐赠y
.必须考虑权重。权重为 2 的捐赠者 selected 的可能性应该是权重为 1
的捐赠者的两倍
我假设缺失的数据是矩形的。换句话说,如果可能缺失的变量集由 x
和 y
组成,则要么两者都缺失,要么两者都不缺失。下面是生成示例数据的一些代码。
global miss_vars "wealth income"
global weight "weight"
set obs 6
gen id = _n
gen type = id > 3
gen income = 5000 * _n
gen wealth = income * 4 + 500 * uniform()
gen weight = 1
replace weight = 4 if mod(id-1,3) == 0
// set income & wealth missing every 3 rows
gen impute = mod(_n,3) == 0
foreach v in $miss_vars {
replace `v' = . if impute == 1
}
数据如下所示:
id type income wealth weight impute
1. 1 0 5000 20188.03 4 0
2. 2 0 10000 40288.81 1 0
3. 3 0 . . 1 1
4. 4 1 20000 80350.85 4 0
5. 5 1 25000 100378.8 1 0
6. 6 1 . . 1 1
所以换句话说,我们需要随机(加权)select一个供体相同类型对每一行有缺失值的观察并使用那个供体填写收入和财富值。在实际使用中类型变量的生成当然是它自己的问题,但我在这里保持非常简单以专注于主要问题。
例如,第 3 行可能类似于以下任一 post hotdeck(因为它填充了第 1 行或第 2 行的收入和财富(但相反,它永远不会从第 1 行获取收入以及第 2 行的财富):
3. 3 0 5000 20188.03 1 1
3. 3 0 10000 40288.81 1 1
此外,由于第 1 行的权重为 4,第 2 行的权重为 1,因此第 1 行应该有 80% 的时间是供体,而第 2 行应该有 20% 的时间是供体。
似乎在 Stata 中没有办法做到这一点,也没有社区提供的命令。有一些社区贡献的命令可以执行 hotdecks(具体来说,hotdeck、whotdeck、 和 hotdeckvar),但其中 none 处理样本权重. whotdeck 命令表面上似乎可以处理权重,但这些不是样本权重,而是内部估计的重要性权重。
于是自己写了一个程序上传到github。它被称为wtd_hotdeck。请关注 link 以获取更多信息和任何后续更新。