Преобразовать один ко многим с 2 цифрами

В настоящее время я работаю с набором данных в Stata, созданным с помощью ODK, набора открытых данных. Существует возможность ответить на вопросы с несколькими ответами. Например, в моей анкете "Каким из этих активов вы владеете?" и интервьюер отметил все ответы из 20 вариантов. Это сгенерировало для меня строковую переменную с таким содержимым, как

 "1 2 3 5 11 17 20"
 "3 4 8 9 11 14 15 18 20"
 "1 3 9 11"

Поскольку это трудно проанализировать для нескольких сотен участников, я хотел сгенерировать новые переменные, создавая 1 или 0 для каждого из вариантов ответа. Для переменной hou_as Я пытался сгенерировать переменные hou_as_1, hou_as_2 и т.д. с помощью следующего кода:

foreach p in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 {
local P : subinstr local p "-" ""
gen byte hou_as_`P' = strpos(hou_as, "`p'") > 0
}

Для однозначных чисел это приводит к тому, что переменная hou_as_1 также заполняется 1, если любой из 10 11 12 ... 19 заполнен, даже если опция 1 не была выбрана. так же hou_as_2 заполняется при выборе опции 2, 12 или 20. Как я могу избежать этой проблемы?

1 ответ

Решение

Вы хотите 20 индикаторных или фиктивных переменных. Во-первых, обратите внимание, что это гораздо проще в использовании forval к петле 1(1)20, например

forval j = 1/20 { 
    gen hou_as_`j' = 0
} 

инициализирует 20 таких переменных как 0.

Я думаю, что проще зацикливать слова переменных вашего ответа, когда слова находятся здесь как раз в том, что разделено пробелами. Максимум 20 слов, и это немного грубо, но, вероятно, будет достаточно быстрым

forval j = 1/20 { 
    forval k = 1/20 { 
        replace hou_as_`j' = 1 if word(hou_as, `k') == "`j'" 
    }
} 

Давайте соберем это вместе и попробуем на вашем примере:

clear 
input str42 hou_as 
 "1 2 3 5 11 17 20"
 "3 4 8 9 11 14 15 18 20"
 "1 3 9 11"
end 

forval j = 1/20 { 
    gen hou_as_`j' = 0
    forval k = 1/20 { 
        replace hou_as_`j' = 1 if word(hou_as, `k') == "`j'" 
    }
} 

Просто чтобы показать, что это сработало:

. list in 3 

     +----------------------------------------------------------------------------+
  3. |   hou_as | hou_as_1 | hou_as_2 | hou_as_3 | hou_as_4 | hou_as_5 | hou_as_6 |
     | 1 3 9 11 |        1 |        0 |        1 |        0 |        0 |        0 |
     |----------+----------+----------+----------+----------+----------+----------|
     | hou_as_7 | hou_as_8 | hou_as_9 | hou_a~10 | hou_a~11 | hou_a~12 | hou_a~13 |
     |        0 |        0 |        1 |        0 |        1 |        0 |        0 |
     |----------+----------+----------+----------+----------+----------+----------|
     | hou_a~14 | hou_a~15 | hou_a~16 | hou_a~17 | hou_a~18 | hou_a~19 | hou_a~20 |
     |        0 |        0 |        0 |        0 |        0 |        0 |        0 |
     +----------------------------------------------------------------------------+

Кстати, твоя линия

local P : subinstr local p "-" ""

ничего полезного не делает. Местный макрос p только когда-либо имеет содержимое, которое является целыми числами, так что нет никакой пунктуации, чтобы удалить.

Смотрите также это объяснение и

. search multiple responses, sj

Search of official help files, FAQs, Examples, SJs, and STBs

SJ-5-1  st0082  . . . . . . . . . . . . . . . Tabulation of multiple responses
        (help _mrsvmat, mrgraph, mrtab if installed)  . . . . . . . .  B. Jann
        Q1/05   SJ 5(1):92--122
        introduces new commands for the computation of one- and
        two-way tables of multiple responses

SJ-3-1  pr0008   Speaking Stata: On structure & shape: the case of mult. resp.
        . . . . . . . . . . . . . . . . . . . . . . . .  N. J. Cox & U. Kohler
        Q1/03   SJ 3(1):81--99                                   (no commands)
        discussion of data manipulations for multiple response data
Другие вопросы по тегам