2015-02-24 2 views
-5

Я новый пользователь stata 13, и я хотел бы узнать, как накладывать результаты нескольких экспериментов.наложение графа в stata 13

У меня есть 1000 кривых (id_1 id_2 .. id_100), каждая кривая имеет одинаковое «x», но не то же самое «y», и я хотел бы построить все кривые, как «спагетти». Я сделал это - вручную :-(-для 100 кривых (прилагается), но я надеюсь, что есть способ сделать это автоматически спасибо за вашу помощь, Маттео

ответ

2

Update: Как наложить вверх до 1500 кривых «автоматически»

Ник Кокс отметил, что мой предыдущий ответ, ниже, не ответил на исходный вопрос, потому что графическая команда Stata twoway scatter не примет 100 переменных сюжета (я обнаружил, что он примет до 99). Однако один может наложить более 100 кривых путем связывания нескольких графических команд twoway (см. стр. 178 руководства по графике Stata 13). Ниже я переключаюсь на twoway connect, потому что twoway scatter требует опции connect(), если вы хотите подключить очки.

Итак:

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

будет перекрывать 100 кривых.

Однако в оригинальном примере плаката ясно, что он хочет наложить плавными кривыми, тогда как twoway connect отобразит маркерные символы для каждой начерченной точки. Единственный способ избежать появления символов - указать, что они невидимы. Я сделал это в предыдущем ответе с опцией msymbol() (ms()). Однако msymbol() имеет предел 20 аргументов. Поэтому при большем количестве рядов необходимо накапливать connect операторы из 20 или менее предикторов. Это означает, что больше нельзя использовать удобный список p* для указания списка переменных предикторов.

С помощью 100 кривых, например, необходимо записать пять операторов соединения с последовательными блоками из 20 пронумерованных предикторов. Это становится очень утомительным и, по собственному опыту, может быть довольно подверженным ошибкам. Более того, хотя в вопросе говорилось о 100 или 1000 кривых, нельзя всегда рассчитывать на такие удобные круглые числа.

Ниже я использую локальные макросы для создания одного оператора twoway. В примере я предполагаю, что есть 108 серий, 107 с 10 наблюдениями, последний с пятью. Будут 108 переменных сюжета py1-py108, и потребуются шесть операторов сотовой связи, четырепять с 20 сериями каждый и последний с восемью.

Вот содержание заключительной фразы, содержащейся в макросе 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) 

.

Максимальное количество возможных кривых - 1500, ограничение (несколько произвольное), налагаемое командой 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 

+0

Это будет очень полезным для многих, но оставляет нетронутый вопрос о том, что вы делаете с 100 или 1000 серий (исходный вопрос остается неясным, но есть проблема в любом случае), как 'graph' не будет принимать много переменных. Я был бы более склонен работать над ответом, если бы были какие-то усилия для улучшения вопроса. –

+0

Согласен. Мы действительно недостаточно знаем о данных или о том, что плакат сделал в Stata до сих пор. –

Смежные вопросы