Цикл по уровням переменной с использованием команды egen - PullRequest
1 голос
/ 09 июля 2019

Я хочу создать новую переменную, которая будет подсчитывать все вхождения указанного кода препарата в столбцах 27. Тем не менее, я хочу сделать это для всех доступных мне кодов лекарств. Я использую цикл и функцию egen anycount().

Однако, когда я попытался запустить его, я получаю сообщение об ошибке:

неверное имя
г (198); * +1010 *

Ниже вы можете найти пример моих данных:

clear
input DrugList Drug1 Drug2 Drug3 Drug4 Drug5
1234 7934 1234 . . .
5678 1234 5678 . . .
9876 9876 3456 . . .
3456 9876 . . . .
7934 9876 5678 7934 1234 .
17453 5678 . . . .
end

Я использую следующий код:

levelsof DrugList

foreach drug in `r(levels)'{
    egen d_`drug' = anycount(Drug1-Drug27), values(`drug')
}

Вывод, который я ожидаю, таков:

  +------------------------------------------------------+
  | d_1234   d_3456   d_5678   d_7934   d_9876   d_17453 |
  |------------------------------------------------------|
  |      1        0        0        1        0         0 |
  |      1        0        1        0        0         0 |
  |      0        1        0        0        1         0 |
  |      0        0        0        0        1         0 |
  |      1        0        1        1        1         0 |
  |      0        0        1        0        0         0 |
  +------------------------------------------------------+

Если я запускаю код без цикла для определенного кода, тогда все работает:

egen d_1234 = anycount(Drug1-Drug27), values(1234)

Что я делаю не так?

1 Ответ

2 голосов
/ 09 июля 2019

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

Рассмотрим следующий игрушечный пример, основанный на слегка измененной версии данных в вашем вопросе:

clear
input DrugList Drug1 Drug2 Drug3 Drug4 Drug5
1234 7934 1234 . . .
5678 1234 5678 . . .
9876 9876 3456 . . .
3456.46 9876 . . . .
7934 9876 5678 7934 1234 .
17453 5678 . . . .
end

levelsof DrugList, clean

foreach drug in `r(levels)' {
    egen d_`drug' = anycount(Drug1-Drug5), values(`drug')
}
d_3456.4599609375 invalid name
r(198);

Решение, которое не требует удаления оскорбительных наблюдений, заключается в использовании функции floor():

clear
input DrugList Drug1 Drug2 Drug3 Drug4 Drug5
1234 7934 1234 . . .
5678 1234 5678 . . .
9876 9876 3456 . . .
3456.46 9876 . . . .
7934 9876 5678 7934 1234 .
17453 5678 . . . .
end

levelsof DrugList, clean

foreach drug in `r(levels)' {
    local drug = floor(`drug')
    egen d_`drug' = anycount(Drug1-Drug5), values(`drug')
}

Если у вас есть отрицательные значения в DrugList, вы можете использовать функцию abs() вместо:

clear
input DrugList Drug1 Drug2 Drug3 Drug4 Drug5
1234 7934 1234 . . .
5678 1234 5678 . . .
9876 9876 3456 . . .
-3456 9876 . . . .
7934 9876 5678 7934 1234 .
17453 5678 . . . .
end

levelsof DrugList, clean

foreach drug in `r(levels)' {
    local drug = abs(`drug')
    egen d_`drug' = anycount(Drug1-Drug5), values(`drug')
}

Конечно, вы также можете комбинировать вышеупомянутые функции:

clear
input DrugList Drug1 Drug2 Drug3 Drug4 Drug5
1234 7934 1234 . . .
5678 1234 5678 . . .
9876 9876 3456 . . .
-3456.46 9876 . . . .
7934 9876 5678 7934 1234 .
17453 5678 . . . .
end

levelsof DrugList, clean

foreach drug in `r(levels)' {
    local drug = abs(floor(`drug'))
    egen d_`drug' = anycount(Drug1-Drug5), values(`drug')
}

Результаты во всех случаях ожидаемые:

list, separator(0)

     +------------------------------------------------------+
     | d_3456   d_1234   d_5678   d_7934   d_9876   d_17453 |
     |------------------------------------------------------|
  1. |      0        1        0        1        0         0 |
  2. |      0        1        1        0        0         0 |
  3. |      1        0        0        0        1         0 |
  4. |      0        0        0        0        1         0 |
  5. |      0        1        1        1        1         0 |
  6. |      0        0        1        0        0         0 |
     +------------------------------------------------------+
...