我是一名新的stata 13用户,我想学习如何覆盖多个实验的结果。
我有1000条曲线(id_1 id_2 .. id_100),每条曲线都有相同的" x"但不一样" y"我想将所有的曲线绘制成一个像#"意大利面条的情节"。 我已经完成了 - 手动:-( - 100条曲线(附)但我希望有一种方法可以自动完成!感谢您的帮助,Matteo
答案 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