Я бы хотел провести простую вменяемую колоду горячих колод в Stata. В SAS эквивалентная команда будет выглядеть следующим образом (и обратите внимание, что это более новая функция SAS, начиная с SAS / STAT 14.1 в 2015 году или около того):
proc surveyimpute method=hotdeck(selection=weighted);
Для ясности, основные требования:
Расчеты в большинстве случаев основаны на строках или одновременны. Если строка 1 жертвует x
строке 3, то она также должна пожертвовать y
.
Должен учитывать вес. Донор с весом = 2 должен быть в два раза более вероятным, чем донор с весом = 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
Другими словами, нам нужно случайным образом (с взвешиванием) выбрать донора одного и того же типа для каждой строки с пропущенными значениями и использовать этого донора для заполнения значений дохода и богатства. В практическом использовании генерация переменной типа, конечно, является собственной проблемой, но я оставлю это очень простым, чтобы сосредоточиться на основной проблеме.
Например, строка 3 может выглядеть как одна из следующих пост-горячей палубы (поскольку она заполняет как доход, так и богатство из строки 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% времени.