Давайте разберемся почему код в вопросе неправильный.OP не дает пример данных, но все ошибки можно идентифицировать без таких данных, естественно, предполагая, что state
является строковой переменной в наборе данных.
Во-первых, мы можем опустить ...
(что никто не считает законным) и скобки (которые не имеют значения).
gen oprim = state=="AL" & "AK" & "CO" & "GA"
gen oprim=1 if state=="AL" & "AK" & "CO" & "GA"
Любой из них завершится ошибкой, потому что Stata анализирует условие if
как
if
state == "AL"
& "AK"
& "CO"
& "GA"
state == "AL"
- это условие истинного или ложного, оцениваемое как 0 или 1, но не равное "AK"
"CO"
"GA"
является истинным или ложным условием;все они являются строковыми значениями, поэтому команды не выполняются, потому что Stata должен видеть что-то числовое в качестве каждого элемента в состоянии if
.Хотя это явно глупо,
gen oprim = state == "AL" & 42
будет допустимым, так как 42 является числовым (и в оценках «истинно или неверно» считается истинным).Stata не будет заполнять state ==
, что, как вы надеетесь, подразумевается.
Если переписать
gen oprim = state == "AL" & state == "AK" & state == "CO" & state == "GA"
, то у вас есть легальная команда.Это просто совсем не то, что вы, очевидно, хотите.Для state
невозможно быть равным различным строковым значениям в одном и том же наблюдении, что и проверяет эта команда.Вы путаете &
(и) с |
(или).
gen oprim = state == "AL" | state == "AK" | state == "CO" | state == "GA"
Такие операторы становятся длинными и утомительными и подвержены ошибкам, но Stata имеет альтернативный синтаксис
gen oprim = inlist(state, "AL", "AK", "CO", "GA")
Есть ограничения для этого - и все же другие стратегии тоже- но я оставлю этот ответ там, не затрагивая дальнейшие вопросы.