Создать таблицу для asclogit и nlogit - PullRequest
0 голосов
/ 27 мая 2018

Предположим, у меня есть следующая таблица:

id | car      | sex    | income
-------------------------------
1  | European | Male   | 45000
2  | Japanese | Female | 48000
3  | American | Male   | 53000

Я хотел бы создать следующую:

  | id | car      | choice | sex    | income
--------------------------------------------
1.| 1  | European | 1      | Male   | 45000
2.| 1  | American | 0      | Male   | 45000
3.| 1  | Japanese | 0      | Male   | 45000
  | ----------------------------------------
4.| 2  | European | 0      | Female | 48000
5.| 2  | American | 0      | Female | 48000
6.| 2  | Japanese | 1      | Female | 48000
  | ----------------------------------------
7.| 3  | European | 0      | Male   | 53000
8.| 3  | American | 1      | Male   | 53000
9.| 3  | Japanese | 0      | Male   | 53000

Я хотел бы установить asclogit и в соответствии с Пример 1 в руководстве Stata, этот формат таблицы кажется необходимым.Тем не менее, я не нашел способ сделать это легко.

Ответы [ 3 ]

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

Примерное решение с использованием Pandas в Python выглядит следующим образом:

1) Откройте базу с помощью:

df = pd.read_stata("mybase.dta")

2) Используйте код принятого ответа этот вопрос .

3) Сохранить базу:

df.to_stata("newbase.dta")
0 голосов
/ 27 мая 2018

Пожалуйста, смотрите dataex в Stata для получения примеров данных, полезных на веб-форумах.(При необходимости сначала установите ssc install dataex.)

Это может быть упражнение с использованием fillin с последующим заполнением пропусков.

* Example generated by -dataex-. To install: ssc install dataex
clear
input byte id str10 car str8 sex long income
1 "European" "Male"   45000
2 "Japanese" "Female" 48000
3 "American" "Male"   53000
end

fillin id car

foreach v in sex income {
    bysort id (_fillin) : replace `v' = `v'[1]
}

list , sepby(id)

     +-------------------------------------------+
     | id        car      sex   income   _fillin |
     |-------------------------------------------|
  1. |  1   European     Male    45000         0 |
  2. |  1   American     Male    45000         1 |
  3. |  1   Japanese     Male    45000         1 |
     |-------------------------------------------|
  4. |  2   Japanese   Female    48000         0 |
  5. |  2   European   Female    48000         1 |
  6. |  2   American   Female    48000         1 |
     |-------------------------------------------|
  7. |  3   American     Male    53000         0 |
  8. |  3   European     Male    53000         1 |
  9. |  3   Japanese     Male    53000         1 |
     +-------------------------------------------+
0 голосов
/ 27 мая 2018

Вы можете использовать команду cross для генерации всех возможных комбинаций:

clear

input byte id str10 car str8 sex long income
1 "European" "Male"   45000
2 "Japanese" "Female" 48000
3 "American" "Male"   53000
end

generate choice = 0
save old, replace

keep id
save new, replace

use old
rename id =_0
cross using new

replace choice = 1 if id_0 == id
replace sex = cond(id == 2, "Female", "Male")
replace income = cond(id == 1, 45000, cond(id == 2, 48000, 53000))

Обратите внимание, что использование функции cond() здесь эквивалентно:

replace sex = "Male"   if id == 1
replace sex = "Female" if id == 2
replace sex = "Male"   if id == 3

replace income = 45000 if id == 1
replace income = 48000 if id == 2
replace income = 53000 if id == 3

Приведенный выше фрагмент кода дает желаемый результат:

drop id_0
order id car choice sex income
sort id car

list, sepby(id)

     +------------------------------------------+
     | id        car   choice      sex   income |
     |------------------------------------------|
  1. |  1   American        0     Male    45000 |
  2. |  1   European        1     Male    45000 |
  3. |  1   Japanese        0     Male    45000 |
     |------------------------------------------|
  4. |  2   American        0   Female    48000 |
  5. |  2   European        0   Female    48000 |
  6. |  2   Japanese        1   Female    48000 |
     |------------------------------------------|
  7. |  3   American        1     Male    53000 |
  8. |  3   European        0     Male    53000 |
  9. |  3   Japanese        0     Male    53000 |
     +------------------------------------------+

Для получения дополнительной информации введите help cross и help cond() в командной строке Stata.

...