在Stata中绘制时间序列:更改日期标签?

时间:2016-04-23 20:14:52

标签: date plot stata

我想在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"。你能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

Stata的日期只是具有非常灵活的显示格式的整数。当你以这种格式引用它们时,Stata并不真正知道你的意思。这种方式很有意义,因为编写一个命令来解析所有不同的可能日期格式真的很难。例如,“01oct1979”,“1/10/79”和“1979年10月1日”只是3种方式来表示自01jan1960以来第7213天的整数。

因此选择

  1. 以数字表示特定日期或月份
  2. 使用像td()tm()这样的函数,将日期或月份映射为整数
  3. 例如,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))