Ohessa on vuoden 2018 tilastoseminaarin (laiva) esitystä, jossa jumppasin pitkittäisaineistoa sellaiseen muotoon, josta voisi tehdä kestoanalyyseja. Alla on toimituskenttä kontrollisarakkeineen (tuon voi kopsata suoraan Survoon/Survo R:ään ja vetäistä vaikka /ACTIVATE + läpi. * * Tekaistu leikkidata, jossa * ajassa havainnoidaan joukkoa yksilöitä. * * Ongelma/tavoite: muokata dataa elinaika-analyyseihin tms. * Saada ohjelma toimimaan erilaisissa tilanteissa. * *Esitys Survo-laivaseminaarissa 2018 *Esityksen B-osa (Survolla "hapuilua"). *Liittyy elinaikadatojen esikäsittelyyn. * *Alla on tehty leikkidata prosessi-/episodijaksojen *tilastolliseen analyysiin. Dataa kertyy jostain prosessista *(esim. palvelutapahtumat, työttömyysrekisteri,...). *Tietoina on * ID = yksilö, T = Aika, U = tapahtuma (esim. työttömyys, lääkitys) * X = "muu" muuttuja (taustatieto) * *Tässä varsinainen tilamuuttuja on U, tilat eivät välttättä *ole toisensa poissulkevia. Lisäksi eri systeemeistä voi *tulla osin päällekäistä informaatiota (samasta asiasta). *Ajatus on luoda vähän hankalampi data ja miettiä mitä *eri ulottuvuuksia/ongelmia datankäsittelyyn aiheutuu :) * *Analyyseissa mallinnetaan mahdollisesti useiden prosessien *kestojen välisiä yhteyksiä. Esim. työllistämistoimintaan *altistumisen kesto/määrä -> työllistymisnopeus. * *Käytännössä ongelmana voi olla, että havainnointiin liittyy "sensurointia", *mahdollisesti sekä alku- että loppupäähän. Tietyssä mielessä *loppupää on lienee melkein jonkin relaation suhteen sensuroitu *(ellei kyseessä ole ihan lopullinen tapahtuma, kuten kuolema). *Alkupäässä ongelma on, ettei esim. tiedetä koska työttömyys- tai *jokin palvelujakso alkoi (tai esim. kuinka pitkään jo asunut tietyssä *kunnassa). * *DATA _K *ID T U X *1 1 0 1 *1 2 0 1 *1 3 0 0 *1 4 1 0 *1 5 1 0 *1 6 0 1 *1 7 0 1 *1 8 1 0 *1 9 1 0 *1 10 0 0 *1 11 1 1 *2 3 1 0 *2 4 1 0 *2 5 0 0 *2 6 1 1 *2 7 1 1 *2 8 1 0 *2 7 1 1 *2 8 1 0 *2 9 1 0 *2 10 0 0 *2 11 0 1 *2 6 0 1 *2 7 0 1 *3 8 1 0 *4 1 0 1 *4 2 0 0 *4 3 1 0 *4 4 1 0 *4 5 1 0 *4 6 1 1 *4 7 1 0 *4 8 1 0 *5 4 1 0 *12 6 0 1 *12 7 0 1 *12 8 0 1 *12 9 0 1 *12 10 0 0 *12 11 0 0 *2 1 3 1 *2 5 3 0 *2 6 3 1 *2 7 3 1 *_ - - - * * *Viimeisellä riillä ID:stä tehdään merkkijono (voi olla esim. hetu tv). *Aikamuuttuja on numeerinen, koska tarkoitus on laskea ajallisia *etäisyyksiä, kestoja. *REPLACE "dTUNIT" "Tdistance" *FILE SHOW K0 *............................ * * Määritellään maksimiaikaetäisyys, joka punoo * "tippuvat" tapahtumat toisiinsa (saman tilan episodiksi). *SAVEP CUR+1,CUR+1,dtcrit / !!!!! * Tdistance=1 / Maksimiaikaväli, joka sitoo tapahtuman yhdeksi episodiksi * * * Tdistance esim. 1 päivä, 1 viikko, 1 kk,... * Jos Tdistance'a kasvattaa, niin etäämmälläkin toisistaan * olevat tapahtumat sidotaan samaksi prosessiksi. * *FILE SHOW K0 * */ACTIVATE2 + * +TUTSAVE F2ESC.TUT / Tekee saman kuin näppäinyhdistelmä F2 + Esc {init}{tempo -2}{R} {pre}{act}{end} * */F2ESC +FILE COPY _K TO NEW K00 / Datan lukeminine .SVOksi * *.......................... * Poistetaan viimeinen "ohjausrivi" (normaalisti * string muodostetaan jo aiemmassa vaiheessa esim. hetu). * +FILE COPY K00 TO NEW K0 / IND=T,!MISSING *.............................. * * +FILE UPDATE K0 * Copy of data matrix _K *FIELDS: (active) * 1 SA_ 2 ID (##) Tutkimusyksilö ID string-muuttuja * 2 NA_ 1 T (##) Mittausjankohta * 3 NA_ 1 U (#) Tapahtuma/prosessitila (0/1) * 4 NA_ 1 X (#) Taustamuuttuja *END * * *......................... * +/F2ESC *FILE SORT K0 BY ID,U,T TO K1 / järjestetään data oikein *FILE EXPAND K1,5,500 / varataan lisää tilaa muuttujille *VAR ORD1=ORDER TO K1 / Havaintojen raakajärjestys * *....................................... *FILE SHOW K1 * +#LOADP dtcrit,CUR+1 / Tulostetetaan Tdistance * Tdistance=1 / Maksimiaikaväli, joka sitoo tapahtuman yhdeksi episodiksi *################## * * Vaihe: "change points" * ID,T,U * U0=0 / Mikä oletus U:lle? * C1=if(str(ID,1)=str(ID[-1],1))then(0)else(1) * +/F2ESC *VAR dID:1=if(ORDER=1)then(1)else(C1) TO K1 / ID:n vaihtumispiste *VAR dIDU:1=if(ORDER=1)then(U0)else(min(1,(1-dID)*(abs(U-U[-1])))) TO K1 / U:n vaihtuminen *VAR dIDT:2=if(ORDER=1)then(0)else((1-dIDU)*(1-dID)*(abs(T-T[-1]))) TO K1 / * *FILE SHOW K1 *................................. +TIME Thu May 17 08:19:55 2018 *FILE SHOW K2 * ACT_BREAK =1 *....................... * Järjestetään ID U ja T +FILE SORT K1 BY ID,U,T TO K2 *........................ *...................... * Lasketaan: * * CT = Tapahtuman/prosessin kesto * T1 = * +#LOADP dtcrit,CUR+1 * Tdistance=1 / Maksimiaikaväli, joka sitoo tapahtuman yhdeksi episodiksi *############ * *FILE SHOW K2 * A1=if(dIDT>Tdistance)then(0)else(1) * A2=if(CT[+1]=0)then(min(1,CT))else(0) * C1=if(str(ID,1)= * +/F2ESC *VAR APU:1=if(ORDER=1)then(1)else(A1) TO K2 *VAR CT=0 TO K2 / Cumulative time *VAR CT=if(ORDER=1)then(0)else(APU*(1-dID)*(1-dIDU)*(dIDT+CT[-1])) TO K2 *VAR VIKA=if(CT[+1]=0)then(1)else(0) TO K2 * *Vanha *VAR VIKA2=if(ORDER=1)then(min(1,abs(ID-ID[+1])*abs(U-U[+1])))else(A2) TO K2 / Jakson viimeinen * * JaksoID * +/F2ESC *VAR JID=if(CT=0)then(1)else(0) TO K2 *VAR JID=if(ORDER>1)then(B1)else(JID) TO K2 * * B1=JID+JID[-1] * *............................... *FILE SHOW K2 * +#STAT K2,CUR+1 / VARS=ORD1 RESULTS=0 *Basic statistics: K2 N=44 *Variable: ORD1 ~ORDER *min=1 in obs.#1 (1) *max=44 in obs.#44 (5) *mean=22.5 stddev=12.84523 skewness=0 kurtosis=-1.242121 *autocorrelation=1.0000 *lower_Q=11.5 median=22.5 upper_Q=33.5 *################## * Viimeisen havainnon käsittely * +VAR VIKA=if(ORDER=max)then(1)else(VIKA) TO K2 * *................................... *FILE SHOW K2 *FILE SHOW K3 * Sitten dataa "tiivistetään" ottamalla vain * episodien alku- ja lopputapahtumat mukaan. * * C1=CT,0 C3=VIKA,0 C2=VIKA,1 * +FILE COPY K2 TO NEW K3 / SELECT=C2+(C1*C3) * *.......................... * *TIME Thu May 10 16:03:14 2018 * ACT_BREAK=1 *..................... *FILE SHOW K3 */ACTIVATE2 + *....................... * Aggregoidaan jokainen ID-episodi * +FILE DEL TMP1 +FILE DEL K4 +FILE SORT K3 BY JID TO TMP1 +FILE AGGR TMP1 BY JID TO K4 *VARIABLES: *JID FIRST JID *ID FIRST ID *U FIRST U / 0,1 *MT0 MIN T / abs alkuaika *MT1 MAX T *T0 MIN CT / rel alkuaika *T1 MAX CT *mX MEAN X *N N T *END *......................... * *FILE SHOW K4 *FILE SHOW K5 +FILE SORT K4 BY ID,MT0 TO K5 * *.................... * Sensuroidut havainnot (välisensurointi?) * Mittausjärjestelmän (msys) alku ja loppu * msyst0=1 msyst1=11 +/F2ESC *VAR LHID:1=if(MT0>msyst0)then(1)else(0) TO K5 / alusta sensuroitu (left) *VAR RHID:1=if(MT1<msyst1)then(1)else(0) TO K5 / lopusta sensuroitu (right) * *Ongelma: *Tässä pitää katsoa laajemmin ID:n koko historiaa, nyt sensuroinnit *tapahtuvat episodi-indeksi (JID) tasolla. Voidaan tehdä FILE *AGGR + FILE COPY (MATCH) avulla, mutta voi olla suurilla datoilla *liian hidas. Kenties parempi tehdä tietokannassa, jonne tämän *käsittelyn datat tultaneen viemään. * * *GOTO CUR-200 *....................... +#STAT K4,CUR+1 / RESULTS=20 VARS=JID,T1 *Basic statistics: K4 N=17 *Variable: JID *min=1 in obs.#1 *max=17 in obs.#17 *mean=9 stddev=5.049752 skewness=0 kurtosis=-1.313725 *autocorrelation=1.0000 *lower_Q=4.75 median=9 upper_Q=13.25 * *Variable: T1 *min=0 in obs.#3 *max=5 in obs.#7 *mean=1.470588 stddev=1.585782 skewness=1.182138 kurtosis=0.357655 *lower_Q=0 median=1 upper_Q=2 *##################### *............................... * +TIME Thu May 17 08:19:57 2018 * * ACT_BREAK=1 / tämä vaatii /ACTIVATE2 sukron, ks. tämän postauksen lopussa * *.............................. *RESIZE 55,100 *FILE SHOW K5 * Esikäsitelty data * *#FILE LOAD +K5,CUR+1 / NAMES8=1 *JID ID U MT0 MT1 T0 T1 mX N LHID RHID * 1.000 1 0 1 3 0.000 2.000 0.500 2 0 1 * 4.000 1 1 4 5 0.000 1.000 0.000 2 1 1 * 2.000 1 0 6 7 0.000 1.000 1.000 2 1 1 * 5.000 1 1 8 9 0.000 1.000 0.000 2 1 1 * 3.000 1 0 10 10 0.000 0.000 0.000 1 1 1 * 6.000 1 1 11 11 0.000 0.000 1.000 1 1 0 * 7.000 12 0 6 11 0.000 5.000 0.500 2 1 0 * 12.000 2 3 1 1 0.000 0.000 1.000 1 0 1 * 10.000 2 1 3 4 0.000 1.000 0.000 2 1 1 * 8.000 2 0 5 7 0.000 2.000 0.500 2 1 1 * 13.000 2 3 5 7 0.000 2.000 0.500 2 1 1 * 11.000 2 1 6 9 0.000 3.000 0.500 2 1 1 * 9.000 2 0 10 11 0.000 1.000 0.500 2 1 0 * 14.000 3 1 8 8 0.000 0.000 0.000 1 1 1 * 15.000 4 0 1 2 0.000 1.000 0.500 2 0 1 * 16.000 4 1 3 8 0.000 5.000 0.000 2 1 1 * 17.000 5 1 4 4 0.000 0.000 0.000 1 1 1 *################### * *Tästä eteenpäin aineistoa voidaan yhdistää muihin taustadatoihin ja/tai *tehdä yksinkertaisempaa elinaika-analyysia. * Ajatus on työstää tuota prosessia niin, että se toimii suurissa datoissa (satoja tuhansia yksilöitä, joita seurataan esim. viikko- kuukausitasolla). Homman voisi tehdä paloittain (esim. /FOR2 luuppisukrolla), niin että tietokannasta otetaan kerralla vain osa ja yo. prosessin jälkeen käsitelty data viedään takaisin tietokantaan (josta sitten R:llä,... tekisi varsinaiset elinaika-analyysit). Mutta tässä pääjuttu oli vähän harjoitella tuollaisen datan kanssa, jossa alku- ja loppupvm ovat ikään kuin analyysivaiheen päätettävissä. Datarakenteet voivat olla erilaisia, esim. toiset datat ovat suoraan sellaisia, joissa on tietoihina prosessin alku- ja loppupvm), tietokannassa sitten yhdistelyä. t. Petri *TUTSAVE ACTIVATE2 / /ACTIVATE <char> / S.Mustonen 26.9.1993 (6.4.1999)(28.6.2001) / activates all commands with <char> in the control column. / ACT_BREAK = 1 spec (p.p, 20xx) / *{tempo -1}{init} - if W1 '=' (empty) then goto H - if W1 '<>' ? then goto S + H: {W1=SURVOACT}{call SUR-SAVE}{break on}{jump 1,1,1,1}SCRATCH {act}{R} *{message} Press ENTER!@ / */ACTIVATE + {R} *activates commands with + in the control column successively{R} *from the line below the /ACTIVATE line onwards. {R} *By default the operations activated are working under {R} *`interaction off' mode. To activate them in `interaction on'{R} *mode, use an extra parameter 1 (i.e. /ACTIVATE +,1 ). {R} - on key - key _: continue - wait 600 *{message shadow 1}{message}@{W1=SURVOACT}{call SUR-RESTORE}{goto E} / / def Wchar=W1 Winter=W2 Wcontr=W3 / + S: {line start}{R} + B: {} / Find next line with control character same as Wchar (W1) *{pre}Lc / *{save spec ACT_BREAK W15}{line start}{l4}{save char Wcontr}{r} - if Wcontr '<>' Wchar then goto F - if Winter '=' {} then goto D *{interaction on} + D: {save stack SUR_ACT}{act}{load stack SUR_ACT}{interaction off} - if W15 '<>' {} then goto E *{ref set 1} + C: {R} *{goto B} + F: {u} + E: {tempo +1}{end} |
Free forum by Nabble | Edit this page |