Как мой цикл должен правильно заменять значения?

Я работаю над научной медицинской статьей, использующей HADS-Score для оценки тревоги и депрессии пациентов. Этот балл состоит из 14 пунктов, разделенных на две субшкалы (HADS-D, HADS-A) по 7 пунктов с возможными значениями от 0 до 3 баллов. У меня отсутствуют данные, и я хочу их заменить. Согласно руководству по оценке, я должен исключить наблюдение, если у меня есть более одного недостающего элемента в одной подшкале. Если в каждой подшкале отсутствует только один пункт, я могу заменить недостающий пункт средним значением имеющихся шести пунктов. У меня есть элементы HADS-Score для каждого наблюдения, хранящиеся в следующих переменных:

  • подшкала HADS-D (суммирование итоговой подшкалы = Hads_anx_score). переменные: Hads_tense_rec, Hads_glad_rec, Hads_omen_rec, Hads_laugh_rec, Hads_trouble_rec, Hads_happy_rec, Hads_Relax_rec
  • подшкала HADS-A (суммирование итоговой подшкалы = Hads_depr_score). переменные: Hads_limited_rec, Hads_scary_rec, Hads_looks_rec, Hads_restless_rec, Hads_future_rec, Hads_panic_rec, Hads_enjoy_rec

Я разбил код на следующие шаги:

  1. Инициализируйте оценки по субшкалам: создайте переменные для субшкал HADS-D и HADS-A.

  2. Определите недостающие значения. Я создал новую переменную is_missing_, чтобы определить, отсутствует ли она.

  3. Подсчитайте недостающие элементы, используя egen и rowtotal, чтобы подсчитать количество недостающих элементов в каждой подшкале.

  4. Отбросить наблюдения: я исключил любое наблюдение, в котором отсутствовало более одного пункта в любой подшкале.

  5. Замена недостающих пунктов по каждой субшкале. Если какой-либо пункт отсутствует, он заменяется средним значением остальных шести пунктов подшкалы.

  6. Подсчитайте общее количество баллов: просуммируйте баллы по каждой субшкале, чтобы получить окончательные баллы.

ПРОБЛЕМА: Каким-то образом мой код не заменяет недостающие элементы в каждой субшкале с помощью цикла, который я создал на шаге 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 == . ).

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пример данных очень поможет. Тем не менее, кажется возможным определить вашу ошибку. Попутно я предложу упрощения вашего кода.

*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 предметам, если один из них отсутствует.

Спасибо за помощь, Ник. Решение работает, возвращая окончательные субшкалы 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 .

Gioni_Bletsch 27.07.2024 16:46

Надеюсь, это разумный способ поделиться примером моих данных. Я попробовал следующий цикл: я нашел следующий цикл, который помогает. 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') }

Gioni_Bletsch 27.07.2024 16:47

Лучше отредактировать вопрос, добавив новый код, но идея кажется правильной.

Nick Cox 27.07.2024 18:13

Другие вопросы по теме