С вашим кодом довольно много проблем. Я пройду через них go один за другим.
`y'_`m'
оценивает 2012_1 первую итерацию. Поскольку он содержит подчеркивание, его нельзя интерпретировать как цифры c. Чтобы быть интерпретированным как строковое значение, требуется, чтобы оно было заключено в "". В конце концов, Stata пытается интерпретировать его как переменную, но 2012_1 не является допустимым именем (должно начинаться с буквы), поэтому ваша ошибка.
Вы можете заключить свое значение в кавычки, чтобы создать строковую переменную: "`y'_`m'"
. Это будет работать для первой итерации, но на второй итерации вы получите ошибку, так как переменная 'date' уже существует. После создания переменной вы можете только replace
it.
Наконец, ваш код ничего не говорит о том, какое значение соответствует какому наблюдению. Даже если вы исправите уже упомянутые проблемы, ваша переменная будет просто содержать одинаковые значения для всех наблюдений, что является значением последней итерации в l oop. Чтобы заменить только одно наблюдение, вы должны указать in i
, где i - номер наблюдения.
В целом, это будет измененный код:
gen date = "."
local obs = 1
forval y=2012/2013{
forval m=1/2{
display `m'
replace date = "`y'_`m'" in `obs'
local ++obs
}
}
Однако я бы не стал рекомендуем создавать этот тип переменной даты, так как строковые переменные ограничены в том, что вы можете с ними делать Внутренний формат даты Stata является наиболее удобным. Если ваши значения 1 и 2 соответствуют полугодиям, вы можете создать полугодовую переменную даты, см. help datetime
для получения информации о том, как это сделать. Другой вариант - создать переменную цифр c, содержащую год, и вторую переменную цифр c, содержащую 1 и 2.