Я работаю над научной медицинской статьей, использующей HADS-Score для оценки тревоги и депрессии пациентов. Этот балл состоит из 14 пунктов, разделенных на две субшкалы (HADS-D, HADS-A) по 7 пунктов с возможными значениями от 0 до 3 баллов. У меня отсутствуют данные, и я хочу их заменить. Согласно руководству по оценке, я должен исключить наблюдение, если у меня есть более одного недостающего элемента в одной подшкале. Если в каждой подшкале отсутствует только один пункт, я могу заменить недостающий пункт средним значением имеющихся шести пунктов. У меня есть элементы HADS-Score для каждого наблюдения, хранящиеся в следующих переменных:
Я разбил код на следующие шаги:
Инициализируйте оценки по субшкалам: создайте переменные для субшкал HADS-D и HADS-A.
Определите недостающие значения. Я создал новую переменную is_missing_
, чтобы определить, отсутствует ли она.
Подсчитайте недостающие элементы, используя egen
и rowtotal
, чтобы подсчитать количество недостающих элементов в каждой подшкале.
Отбросить наблюдения: я исключил любое наблюдение, в котором отсутствовало более одного пункта в любой подшкале.
Замена недостающих пунктов по каждой субшкале. Если какой-либо пункт отсутствует, он заменяется средним значением остальных шести пунктов подшкалы.
Подсчитайте общее количество баллов: просуммируйте баллы по каждой субшкале, чтобы получить окончательные баллы.
ПРОБЛЕМА: Каким-то образом мой код не заменяет недостающие элементы в каждой субшкале с помощью цикла, который я создал на шаге 5. и оставляет недостающие данные (== .)
*STEP 1: Initialize the HADS-A and HADS-D subscales
gen hads_anx_score = .
gen hads_depr_score = .
* STEP 2:Loop over each observation
foreach var in hads_tense_rec hads_glad_rec hads_omen_rec hads_laugh_rec hads_trouble_rec hads_happy_rec hads_relax_rec hads_limited_rec hads_scary_rec hads_looks_rec hads_restless_rec hads_future_rec hads_panic_rec hads_enjoy_rec {
gen is_missing_`var' = missing(`var')
}
* STEP 3: Calculate the number of missing items per subscale
egen missing_hads_anx = rowtotal(is_missing_hads_tense_rec is_missing_hads_glad_rec is_missing_hads_omen_rec is_missing_hads_laugh_rec is_missing_hads_trouble_rec is_missing_hads_happy_rec is_missing_hads_relax_rec)
egen missing_hads_depr = rowtotal(is_missing_hads_limited_rec is_missing_hads_scary_rec is_missing_hads_looks_rec is_missing_hads_restless_rec is_missing_hads_future_rec is_missing_hads_panic_rec is_missing_hads_enjoy_rec)
* STEP 4. Drop observations with more than one missing item in any subscale
drop if missing_hads_anx > 1 | missing_hads_depr > 1
**STEP 5.** Replace single missing items with the mean of the present six items
foreach var in hads_tense_rec hads_glad_rec hads_omen_rec hads_laugh_rec hads_trouble_rec hads_happy_rec hads_relax_rec {
qui replace `var' = (hads_tense_rec + hads_glad_rec + hads_omen_rec + hads_laugh_rec + hads_trouble_rec + hads_happy_rec + hads_relax_rec - `var') / 6 if is_missing_`var' == 1 & missing_hads_anx == 1
}
foreach var in hads_limited_rec hads_scary_rec hads_looks_rec hads_restless_rec hads_future_rec hads_panic_rec hads_enjoy_rec {
qui replace `var' = (hads_limited_rec + hads_scary_rec + hads_looks_rec + hads_restless_rec + hads_future_rec + hads_panic_rec + hads_enjoy_rec - `var') / 6 if is_missing_`var' == 1 & missing_hads_depr == 1
}
Теперь, если я выполню **пятый шаг**, данные все равно будут отсутствовать (например, Hads_limited_rec == . ).
Пример данных очень поможет. Тем не менее, кажется возможным определить вашу ошибку. Попутно я предложу упрощения вашего кода.
*STEP 1: Initialize the HADS-A and HADS-D subscales
gen hads_anx_score = .
gen hads_depr_score = .
Шаг 1, кажется, не имеет смысла. Вы никогда не используете и не меняете эти переменные.
* STEP 2:Loop over each observation
foreach var in hads_tense_rec hads_glad_rec hads_omen_rec hads_laugh_rec hads_trouble_rec hads_happy_rec hads_relax_rec hads_limited_rec hads_scary_rec hads_looks_rec hads_restless_rec hads_future_rec hads_panic_rec hads_enjoy_rec {
gen is_missing_`var' = missing(`var')
}
* STEP 3: Calculate the number of missing items per subscale
egen missing_hads_anx = rowtotal(is_missing_hads_tense_rec is_missing_hads_glad_rec is_missing_hads_omen_rec is_missing_hads_laugh_rec is_missing_hads_trouble_rec is_missing_hads_happy_rec is_missing_hads_relax_rec)
egen missing_hads_depr = rowtotal(is_missing_hads_limited_rec is_missing_hads_scary_rec is_missing_hads_looks_rec is_missing_hads_restless_rec is_missing_hads_future_rec is_missing_hads_panic_rec is_missing_hads_enjoy_rec)
Шаги 2 и 3 можно заменить двумя утверждениями. Вам не нужны никакие из этих индикаторных переменных для отсутствия.
egen missing_hads_anx = rowmiss(hads_tense_rec hads_glad_rec hads_omen_rec hads_laugh_rec hads_trouble_rec hads_happy_rec hads_relax_rec)
egen missing_hads_depr = rowmiss(hads_limited_rec hads_scary_rec hads_looks_rec hads_restless_rec hads_future_rec hads_panic_rec hads_enjoy_rec)
* STEP 4. Drop observations with more than one missing item in any subscale
drop if missing_hads_anx > 1 | missing_hads_depr > 1
Шаг 4 кажется нормальным.
**STEP 5.** Replace single missing items with the mean of the present six items
foreach var in hads_tense_rec hads_glad_rec hads_omen_rec hads_laugh_rec hads_trouble_rec hads_happy_rec hads_relax_rec {
qui replace `var' = (hads_tense_rec + hads_glad_rec + hads_omen_rec + hads_laugh_rec + hads_trouble_rec + hads_happy_rec + hads_relax_rec - `var') / 6 if is_missing_`var' == 1 & missing_hads_anx == 1
}
foreach var in hads_limited_rec hads_scary_rec hads_looks_rec hads_restless_rec hads_future_rec hads_panic_rec hads_enjoy_rec {
qui replace `var' = (hads_limited_rec + hads_scary_rec + hads_looks_rec + hads_restless_rec + hads_future_rec + hads_panic_rec + hads_enjoy_rec - `var') / 6 if is_missing_`var' == 1 & missing_hads_depr == 1
}
Код на шаге 5 содержит ошибки. RHS всегда будет отсутствовать, если отсутствует какая-либо из исходных переменных, и даже в противном случае. Тонкое отличие состоит в том, что generate
не будет игнорировать пропущенные значения в сумме, тогда как для этого существуют функции egen
.
По сути, 3 + .
возвращается как отсутствующее, а не 3
(и то же самое справедливо для любой другой суммы непропущенных и пропущенных значений).
Сначала вам нужно среднее значение непропущенных значений.
egen mean_hads_anx = rowmean(hads_tense_rec hads_glad_rec hads_omen_rec hads_laugh_rec hads_trouble_rec hads_happy_rec hads_relax_rec)
egen mean_hads_depr = rowmean(hads_limited_rec hads_scary_rec hads_looks_rec hads_restless_rec hads_future_rec hads_panic_rec hads_enjoy_rec)
Затем вам нужны суммы непропущенных значений.
egen score_hads_anx = rowtotal(hads_tense_rec hads_glad_rec hads_omen_rec hads_laugh_rec hads_trouble_rec hads_happy_rec hads_relax_rec)
egen score_hads_depr = rowtotal(hads_limited_rec hads_scary_rec hads_looks_rec hads_restless_rec hads_future_rec hads_panic_rec hads_enjoy_rec)
Тогда окончательные результаты должны быть зафиксированы тогда и только тогда, когда в каждом случае есть одно пропущенное значение:
replace score_hads_depr = score_hads_depr + mean_hads_depr if missing_hads_depr == 1
replace score_hads_anx = score_hads_anx + mean_hads_anx if missing_hads_anx== 1
Альтернативно, исправлением является всего лишь (7/6) оценка по 6 предметам, если один из них отсутствует.
Надеюсь, это разумный способ поделиться примером моих данных. Я попробовал следующий цикл: я нашел следующий цикл, который помогает. foreach var in hads_tense_rec hads_glad_rec hads_omen_rec hads_laugh_rec hads_trouble_rec hads_happy_rec hads_relax_rec{ replace
var' = mean_hads_anx, если отсутствует(var') }
Лучше отредактировать вопрос, добавив новый код, но идея кажется правильной.
Спасибо за помощь, Ник. Решение работает, возвращая окончательные субшкалы
score_hads_depr
иscore_hads_anx
. Поскольку мне также нужны исходные переменные с заменой отсутствующих данных средствами, мне нужен код, заменяющий отсутствующие данные. Вот образец данных:input byte(hads_tense_rec hads_glad_rec hads_omen_rec hads_laugh_rec hads_trouble_rec hads_happy_rec hads_relax_rec) 1 2 2 1 2 1 2 . . . . . . . 0 3 . 0 . 2 3 1 . 0 0 . 1 2 1 1 0 1 2 . 2 0 . . . 0 2 .