在stata 13中叠加图形

时间:2015-02-24 16:28:00

标签: graph stata

我是一名新的stata 13用户,我想学习如何覆盖多个实验的结果。

我有1000条曲线(id_1 id_2 .. id_100),每条曲线都有相同的" x"但不一样" y"我想将所有的曲线绘制成一个像#"意大利面条的情节"。 我已经完成了 - 手动:-( - 100条曲线(附)但我希望有一种方法可以自动完成!感谢您的帮助,Matteo

1 个答案:

答案 0 :(得分:2)

更新:如何“自动”覆盖最多1,500条曲线

尼克考克斯指出,我之前的答案没有回答原来的问题,因为Stata的twoway scatter图形命令不会接受100个绘图变量。 (我发现它最多可以接受99)。但是,通过链接多个twoway图形命令,一个可以覆盖100多条曲线(参见Stata 13图形手册的第178页)。我在下面切换到twoway connect,因为twoway scatter如果要连接点,则需要connect()选项。

所以:

twoway (connect p1-p50 x) (connect p51-p100 x)

将叠加100条曲线。

然而,原始海报的示例清楚地表明他想要叠加平滑曲线,而twoway connect将显示每个绘制点的标记符号。避免看到符号的唯一方法是指定它们是不可见的。我在上一个回答中使用msymbol()选项(简称ms())执行了此操作。但是msymbol()限制为20个参数。因此,随着序列数量的增加,人们需要累积每个20个或更少预测变量的connect个语句。这意味着人们不能再使用方便的p* varlist来指定预测变量列表。

例如,对于100条曲线,有必要使用20个编号预测变量的连续块写出五个连接语句。这变得非常繁琐,而且从个人经验来看,可能非常容易出错。此外,尽管问题涉及100或1,000条曲线,但人们不能总是指望这种方便的圆形数字。

下面,我使用本地宏来构造单个twoway语句。在示例中,我假设有108个系列,107个有10个观察值,最后一个有5个。将有108个绘图变量py1-py108,需要6个连接语句, 4 5 ,每个20个系列,最后一个有8个。

以下是宏plot_command中包含的最终绘图语句的内容。为了便于阅读,我打破了界限。

twoway (connect(py1 - py20  x, ms(i i i i i i i i i i i i i i i i i i i i)))     
(connect(py21 - py40  x, ms(i i i i i i i i i i i i i i i i i i i i)))    
(connect(py41 - py60  x, ms(i i i i i i i i i i i i i i i i i i i i))) 
(connect(py61 - py80  x, ms(i i i i i i i i i i i i i i i i i i i i))) 
(connect(py81-py88 x, ms(i i i i i i i i i i i i i i i i i i i i)) ) , legend(off)

可能的最大曲线数为1,500,这是separate命令施加的限制(有些随意)。

 clear

 set obs 1075
 gen int id = ceil(_n/10)  /* original id */

/* IDs might not be consecutive integers, and might also not be numeric.
   Therefore, create a new id consisting of consecutive integers starting with 1 */

  egen idnew = group(id)
 /* get total number of ids */
  sum idnew
  local n_ids = r(max)
  di `n_ids'

/*number of connect statements needed */

  local csecs = ceil(`n_ids'/20)
  di `csecs'


/* Data for plotting */
gen x = rnormal()
gen py = id + x /*variable to plot for each series*/

*****************************
 sort py id // crucial for plotting
*****************************
qui separate py, by(id)


/* Construct local macros to build up the twoway statement */

/* macro "mspart" will contain the msymbol option
   It will contain 20 "i"'s which will not cause
   an error even if the number of plot variables is
   < 20 */


 local mspart = " ms(i i i i i i i i i i i i i i i i i i i i)"

/* Start each connect command */
 local cstart = "(connect "

/* Construct the connect statement for for consecutive blocks of 20 series.  */
 forvalues i = 1/`=`csecs'-1'{
    local c1_`i' = ///
    "`cstart'"+"py" +string(20*(`i'-1)+1) +" - py"+string(20*(`i'-1)+20)
    local c1_`i' =  "`c1_`i''" + "  x, " + "`mspart'"+") "
    }

/* Construct one more connect statement for the remaining series */
 local extra = mod(`n_ids',20)

 if `extra' == 0 {
     local extra = 20
     }
       local c1_`csecs'= ///
     "`cstart'" + "py"+string(20*(`csecs'-1)+1) + "-py"+string(20*(`csecs'-1)+`extra')+" x, "+"`mspart'"+ ") "


/* Now put all the connect statements into one macro */
forvalues i = 1/`csecs' {
    local com = "`com'"  + "`c1_`i''"
    }

/* Finish the twoway statement */
local plot_command = "twoway " +"`com'" + ", legend(off)"
di "`plot_command'"

/* Get the plots */

`plot_command'

原帖

虽然你还没有提供基于答案的代码,但这个问题很有意思,所以我会提供一个解决方案。你必须适应你的问题。 StackOverlow here上有一个类似的问题,但答案并没有解决问题的自动化部分。在下文中,我使用标准系统自动数据集。我从id变量创建了一个rep78变量;使用mpg作为“y”变量,使用turn作为“x”。如果有一个您不理解的命令,请在help中查找。请注意,“///”连接两行。请参阅“帮助评论”

sysuse auto, clear

/* Create a numeric id variable that starts with "1" and is numbered
   consecutively */
egen id = group(rep78)

/* get count of id from -summarize- output*/
sum id
local n_id = r(max)   /* local macro */
di "Number of ids is: `n_id'"

/* Create a response for