Создать переменную с несколькими категориями - PullRequest
0 голосов
/ 16 мая 2018

Я хотел бы создать numerical переменную pets со следующими категориями:

  • Кошка (24%)
  • Собака (36%)
  • Рыба (16%)
  • Хомяк (12%)
  • Кролик (10%)
  • Змея (2%)

Возможно ли это сделать?

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Это примечание к отличному ответу @Pearly Spencer.

Другой способ сделать это -

clear
set obs 50
generate pets = cond(_n <= 12, 1, ///
                cond(_n <= 30, 2, ///
                cond(_n <= 38, 3, ///
                cond(_n <= 44, 4, ///
                cond(_n <= 49, 5, ///
                6 )))))  

с последующим созданием и назначением меток значений (как в ответе Пирли), а также expand при необходимости.

Случайность с точки зрения порядка в наборе данных может быть придана путем перемешивания в соответствии со случайными числами.

cond() не так сложно использовать с множеством вложений, как часто утверждается или считается.Это помогает запомнить простое правило, как в элементарной алгебре, что каждая левая скобка ( является обязывающим обязательством, которое потом будет соответствовать правой скобке ), и мысленно обмениваться кодом (если X1, то Y1; в противном случае, еслиX2, затем Y2; в противном случае, если X3, то Y3; ...; в противном случае Yk).

Обратите внимание, что комментарии в форме /// не допускаются в интерактивном режиме, но макет, подобный приведенному выше, является хорошей идеей для повышения ясности и уменьшения ошибок.Лучше всего написать код такого типа в do-файле или программе в любом случае.

0 голосов
/ 16 мая 2018

Я думаю, что самый простой способ создать эту переменную - использовать функцию mata rdiscrete().

Предполагая 1000 наблюдений:

clear
set obs 1000

generate pets = . 
mata: st_store(., "pets", rdiscrete(1000, 1, (0.24, 0.36, 0.16, 0.12, 0.1, 0.02)))

(Примечание: функция mata st_store() используется для изменения значений, хранящихся в переменной pets)

Затем вы определяете и присваиваете value label переменной pets:

label define petslabel 1 "Cat" 2 "Dog" 3 "Fish" 4 "Hamster" 5 "Rabbit" 6 "Snake"
label values pets petslabel

tabulate pets

       pets |      Freq.     Percent        Cum.
------------+-----------------------------------
        Cat |        241       24.10       24.10
        Dog |        350       35.00       59.10
       Fish |        165       16.50       75.60
    Hamster |        111       11.10       86.70
     Rabbit |        112       11.20       97.90
      Snake |         21        2.10      100.00
------------+-----------------------------------
      Total |      1,000      100.00

Тем не менее, как вы можете видеть, результаты являются приблизительными, так как функция рисует случайные выборки, используя распределение discrete. Таким образом, вам может понадобиться запустить этот код несколько раз, чтобы получить числа, наиболее близкие к тому, что вы хотите.

Если вам нужны точные результаты, вам придется создавать категории вручную:

clear
set obs 1000

generate pets = 1 if _n <= 0.24 * 1000
replace  pets = 2 if _n <= 0.60 * 1000 & _n > 0.24 * 1000
replace  pets = 3 if _n <= 0.76 * 1000 & _n > 0.60 * 1000
replace  pets = 4 if _n <= 0.88 * 1000 & _n > 0.76 * 1000
replace  pets = 5 if _n <= 0.98 * 1000 & _n > 0.88 * 1000
replace  pets = 6 if _n >  0.98 * 1000

label define petslabel 1 "Cat" 2 "Dog" 3 "Fish" 4 "Hamster" 5 "Rabbit" 6 "Snake"
label values pets petslabel

tabulate pets

       pets |      Freq.     Percent        Cum.
------------+-----------------------------------
        Cat |        240       24.00       24.00
        Dog |        360       36.00       60.00
       Fish |        160       16.00       76.00
    Hamster |        120       12.00       88.00
     Rabbit |        100       10.00       98.00
      Snake |         20        2.00      100.00
------------+-----------------------------------
      Total |      1,000      100.00

EDIT:

Следуя коварному ответу @Nick Cox, вот как вы можете ввести случайность:

generate double random = runiform()
sort random pets

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

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

...