我想在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 :(得分:1)
Stata的日期只是具有非常灵活的显示格式的整数。当你以这种格式引用它们时,Stata并不真正知道你的意思。这种方式很有意义,因为编写一个命令来解析所有不同的可能日期格式真的很难。例如,“01oct1979”,“1/10/79”和“1979年10月1日”只是3种方式来表示自01jan1960以来第7213天的整数。
因此选择
td()
或tm()
这样的函数,将日期或月份映射为整数例如,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将转向gremlin。每月tm()
甚至不那么杂食,所以唯一的选择就是亨利·福特式的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))