Игнорировать пропущенные значения при генерации новой переменной - PullRequest
0 голосов
/ 23 февраля 2019

Я хочу создать новую переменную в Stata, которая является функцией 3 различных переменных, X, Y и Z, например:

gen new_var = (((X)*3) + ((Y)*2) + ((Z)*4))/7

Все наблюдения имеютпропущенные значения для одной или двух переменных.

Когда я запускаю вышеупомянутую команду, все, что она генерирует, - это пропущенные значения, потому что ни у одного наблюдения нет значений для всех 3 переменных.Я бы хотел, чтобы Stata завершил функцию, игнорируя пропущенные переменные.

Я безуспешно пытался выполнить следующие команды:

gen new_var= (cond(missing(X*3),., X) + cond(missing(Y*2),., Y))/7 
gen new_var= (!missing(X*3+Y*2+Z*4)/7)
gen new_var=  (max(X , Y, Z)/7) if missing(X , Y, Z) 

Команда egen не позволяет выполнять сложные функции;в противном случае rowtotal() может работать.


РЕДАКТИРОВАТЬ:

Для пояснения, «игнорирование отсутствующих переменных» означает, что даже если любая из компонентных переменных не являетсяотсутствует, затем примените функцию только к этой переменной и создайте значение для новой переменной.Новая переменная должна иметь пропущенные значения только тогда, когда отсутствуют все три переменные компонента.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Если вы просто хотите «игнорировать пропущенные значения» без «обработки их как нулей», будет работать следующее:

clear
set obs 10

generate X = rnormal(5, 2)
generate Y = rnormal(10, 5)
generate Z = rnormal(1, 10)

replace X = . in 2
replace Y = . in 5
replace Z = . in 9

generate new_var = (((X)*3) + ((Y)*2) + ((Z)*4)) / 7 if X != . | Y != . | Z != .

list

     +---------------------------------------------+
     |        X          Y           Z     new_var |
     |---------------------------------------------|
  1. | 3.651024    3.48609    -24.1695   -11.25039 |
  2. |        .   14.14995    8.232919           . |
  3. | 3.689442   9.812483    1.154064    5.044221 |
  4. | 2.500493   13.02909     5.25539    7.797317 |
  5. |  4.19431          .    6.584174           . |
  6. | 7.221717   13.92533    5.045283    9.956708 |
  7. | 5.746871   14.26329    3.828253    8.725744 |
  8. | 1.396223    16.2358    19.01479    16.10277 |
  9. | 4.633088   13.95751           .           . |
 10. | 2.521546   4.490258   -3.396854     .422534 |
     +---------------------------------------------+

В качестве альтернативы, вы также можете использовать функцию inlist():

generate new_var = (((X)*3) + ((Y)*2) + ((Z)*4)) / 7 if !inlist(., X, Y, Z) 
0 голосов
/ 23 февраля 2019

Я собираюсь догадаться, что «игнорирование пропущенных значений» означает «обрабатывать их как нули».Если у вас есть другая идея, вы должны сделать это явно.

Это может быть

gen new_var = (cond(missing(X), 0, 3 * X) ///
+ cond(missing(Y), 0, 2 * Y) ///
+ cond(missing(Z), 0, 4 * Z)) / 7 

Давайте посмотрим на ваши решения и объясним, почему они все не правы в целом или обычно.

(cond(missing(X*3),., X) + cond(missing(Y*2),., Y))/7 

Достаточно отметить, что если верно, что X отсутствует, то cond() приводит к отсутствию, тогда как X * 3 также отсутствует.Такое же замечание относится к терминам, включающим Y и Z.Таким образом, вы заменяете все пропущенные значения пропущенными значениями, а это не выгода.

!missing(X*3+Y*2+Z*4)/7

Учитывая информацию о том, что по крайней мере один из X Y Z всегда отсутствует, это значение всегда равно 0/7 или 0. Даже если бы X Y Z не было пропущено, тогда он оценил быдо 1/7.Это далеко от суммы, которую вы хотите.missing() всегда дает 1 или 0, а его отрицание, таким образом, 0 или 1.

(max(X, Y, Z)/7) if missing(X , Y, Z) 

Максимум X, Y, Z будет правильным ответом, если и только если одиниз значений не пропущены, а два других отсутствуют.max() в максимально возможной степени игнорирует пропуски (даже если в других контекстах пропуски рассматриваются как произвольно большие положительные числа).

...