Stata xtline叠加了多个组的图

时间:2017-03-23 16:48:19

标签: stata

我试图通过为每个组显示不同的绘图样式来生成覆盖的 - 纹理图,以区分男性和女性(或任意数量的多个组)。我选择将xtline图重铸为“已连接”,并使用圆形标记和女性作为三角形标记显示男性。从this question on Statalist获取线索,我制作了类似于下面的代码。当我尝试这个解决方案时,Stata会产生“太多选项”错误,考虑到大量独特的人,这个错误可能是可以预测的。我知道this solution使用组合图,但鉴于我的数据中有大量独特个体,这也不实用。

是否存在针对此问题的更简单的解决方案? Stata是否有能力覆盖多个样本图,就像它可以 - 图表一样?

以下代码使用加州大学洛杉矶分校优秀Stata指南中的公开数据显示我的基本代码并重现错误:

use http://www.ats.ucla.edu/stat/stata/examples/alda/data/alcohol1_pp, clear 
xtset id age

gsort -male id
qui levelsof id if !male, loc(fidlevs)
qui levelsof id if male, loc(midlevs)
qui levelsof id, loc(alllevs)

tokenize `alllevs'

loc len_f : word count `fidlevs'
loc len_m : word count `midlevs'
loc len_all : word count `alllevs'

loc start_f = `len_all' - `len_f'

forval i = 1/`len_all' {
    if `i' < `start_f' {
        loc m_plot_opt "`m_plot_opt' plot`i'opts(recast(connected) mcolor(black) msize(medsmall) msymbol(circle) lcolor(black) lwidth(medthin) lpattern(solid))"
    }
    else if `i' >= `start_f' {
        loc f_plot_opt "`f_plot_opt' plot`i'opts(recast(connected) mcolor(black) msize(medsmall) msymbol(triangle) lcolor(black) lwidth(medthin) lpattern(solid))"
    }
}

di "xtline alcuse, legend(off) scheme(s1mono) overlay `m_plot_opt' `f_plot_opt'"
xtline alcuse, legend(off) scheme(s1mono) overlay `m_plot_opt' `f_plot_opt'

1 个答案:

答案 0 :(得分:0)

很难(对我而言)将这里的编程问题与关于什么类型的图表运行良好或完全没有的统计或图形视图分开。即使使用这个适度的数据集,也有82个不同的标识符,因此任何明显显示它们的尝试都不会有用,只是因为生成的图例占据了大部分房地产。

在处理所有标识符的问题代码中有相当大的聪明才智,但是粗略的方法似乎也有效。试试这个:

use http://www.ats.ucla.edu/stat/stata/examples/alda/data/alcohol1_pp, clear 
xtset id age
separate alcuse, by(male) veryshortlabel 
label var alcuse1 "male"
label var alcuse0 "female"  
line alcuse? age, legend(off) sort connect(L)  

关键点:

  1. xtline没有什么特别之处。它只是一个方便的包装。如果因为有线选择而感到沮丧,人们往往只能到达line

  2. 要获得不同的颜色,不同的变量就足够了,这就是separate有角色的地方。另见this Tip

  3. 虽然示例数据集表现良好,但在某些情况下,额外选项sort connect(L)将有助于删除个人或面板之间的虚假连接。 (在极端情况下,达到linkplot(SSC)。)

  4. 这也可以。

    line alcuse age if male || line alcuse age if !male, legend(order(1 "male" 2 "female")) sort connect(L)