2016-04-23 3 views
0

Я хочу построить временные ряды в Стате.Построение временных рядов в Stata: изменить метку дат?

У меня есть CSV-файл (FILE.CSV), который выглядит как

v1   v2 
01/01/2000 1.1 
01/02/2000 1.2 
01/03/2000 1.3 
01/04/2000 1.4 
01/05/2000 1.5 
01/06/2000 1.6 
01/07/2000 1.7 
01/08/2000 1.8 
01/09/2000 1.9 
01/10/2000 1.10 
01/11/2000 1.11 
01/12/2000 1.12 

Для построения временных рядов в Stata я делаю:

clear all 
*import data 
import ...fil.csv 

*adjust dates 
gen Time_temp = date(v1, "MDY") 
format Time_temp %tm 
gen Time = mofd(Time) 
label variable Time "Time" 
format Time %tm 
tsset Time 
drop Time_temp 

*1) Assign a label to v2 
label variable Price "Monthly price ($)" 
*2) plot time series of v2 with the median, mean, min, max 
egen median_v2 = median(Oil_price) 
egen mean_v2=mean(v2) 
egen min_v2 = min(v2) 
egen max_v2=max(v2) 
label variable median_v2 "Median ($)" 
label variable mean_v2 "Mean ($)" 
label variable min_v2 "Min ($)" 
label variable max_v2 "Max ($)" 
twoway tsline v2 || tsline median_v2 || tsline mean_v2 || tsline min_v2 || tsline max_v2, xlabel(2000m1 "Jan2000" 2000m3 "March2000" 2000m12 "Dec2000", angle(vertical)) xmtick(##12) 

я получаю как ошибка: invalid label specifier, : 2000m1 "Jan2000" 2001m3 "March2000" 2001m12 "Dec2000". Не могли бы вы помочь мне исправить это?

+0

Здесь перечислены две конкретные ошибки: назначение формата отображения даты в день на ежедневную дату не изменит его на месячную дату; строки, такие как '2000m1', не могут служить числовыми значениями для указания текста метки оси. Ответ @Dimitriy Masterov дает хороший совет. Пожалуйста, прочитайте http://stackoverflow.com/help/mcve Ссылки на ваши файлы не могут быть воспроизведены нами, и здесь подробно о медиане, значении, min, max не имеет отношения к вашей проблеме. –

+0

Первая ошибка была объяснена в ответе на ваш предыдущий вопрос. http://stackoverflow.com/questions/36812591/transform-string-monthly-dates-in-stata –

ответ

1

Даты Stata - это целые числа, которые имеют очень гибкий формат отображения. Когда вы ссылаетесь на них в этом формате, Stata действительно не знает, что вы имеете в виду. Такой подход имеет смысл, поскольку было бы очень сложно написать команду для анализа всех разных возможных форматов даты. Например, «01oct1979», «1/10/79» и «1 октября 1979 года» - всего лишь 3 способа обращения к целому числу 7213-й день с 01jan1960.

Таким образом, выбор либо

  1. относится к определенным дням или месяцам по номеру
  2. Используйте функцию как td() или , отображающей дату или месяц до целого

Например, td(01oct1979)=7213. Несмотря на то, что говорит документация, существует определенная гибкость в том, что вы можете подать td(), хотя это кажется плохим. Например, td(01.10.1979), td(01/10/1979), td(01 10 1979) все, похоже, работают, но в евро формате td(10/01/1979)=6949 нет. Даже не думайте о том, чтобы прокормить его струной, например td("October 1, 1979"): mogwai превратится в гремлин. Ежемесячно еще менее всеядны, поэтому единственный выбор - это Генри Форд-эск tm(1979m10)=237.

Вот пример того, что во избежание ваше сообщение об ошибке несколькими способами:

clear 
input t y 
7213 0 
20567 36 
end 
format t %td 
list y t 
tsset t 
tsline y, tlabel(#2) name(g1, replace) // baseline 
tsline y, tlabel(7213 20567, format(%tddd_Mon,_YY)) name(g2, replace) // just change the format 
tsline y, tlabel(7213) tlabel(20567 "Today", add) name(g3, replace) // add a second custom label 
tsline y, tlabel(7213) tlabel(`=td(23apr2016)' "Today #2", add) name(g4, replace) //add a second custom label without knowing the integer date value 
graph combine g1 g2 g3 g4, rows(4) scale(.75) 

В коде, вы также делаете несколько странно, пытаясь перейти от ежедневных до ежемесячных данных, как в форматирования и зарисовки. Я бы сделал это вот так:

clear 
input str11 v1 
"01/01/2000"  
"01/02/2000"  
"01/03/2000"  
"01/04/2000"  
"01/04/2000"  
"02/01/2000"  
"02/02/2000"  
"02/03/2000"  
"02/04/2000"  
end 

gen v2 = _n*rnormal()+23 
gen Time_temp = date(v1, "MDY") 
format Time_temp %td 
gen Time = mofd(Time) 
label variable Time "Time" 
format Time %tm 
collapse (mean) mean = v2 (median) median = v2 (min) min = v2 (max) max = v2, by(Time) 
tsset Time 
tsline mean median min max, tlabel(, format(%tm_Mon_YY)) 
+0

С примером, который я задал в своем вопросе, я получаю странный график, со всеми датами, рухнувшими на rhs и сюжете на lhs. – user3285148

+0

@ user3285148 У меня нет ваших данных, поэтому, насколько я понимаю, у меня есть ежедневная (td) переменная, но вы хотите ежемесячный график (tm). Я бы рухнул сперва до месяца, снова tsset, а затем заговор. –

+0

Без коллапса я не уверен, как ваш код работает даже без жалоб на повторяющиеся значения времени, когда вы tsset. –

Смежные вопросы