[viesti Survo-keskustelupalstalla (2001-2013)]
Kirjoittaja: | Petri Palmu |
---|---|
Sähköposti: | petri.palmu'at'helsinki.fi |
Päiväys: | 1.3.2004 17:36 |
Sukrokurssi jatkuu... Jatkan paneeliaineistojen pyörittelyä. Nyt tehtävä on muokata aineistoa suuntaan "Long" -> "Wide". Sukro tekee saman kuin VEC(A,k) eli siirtää matriisissa A aina k:n rivin pituiset osa-aineistot sarakkeille. Kuitenkin, jos alkuperäinen aineisto sisältää useita string-taustamuuttujia, kuten koeaineistossa alueiden nimiä, niin hommaa ei voida viedä läpi suoraan matriisioperaatioin. Taustatietojen mukana pysyminen edellyttää taustamuuttuja-aineiston ja numeerisen X-muuttuja-aineiston ensin erottamista ja sitten yhteenliittämistä (sen jälk. kun molemmat ovat halutussa muodossa). Jos matriisi A sisältää vain yhden sarakkeen, niin VEC(A,k) ja VEC(A) ovat puhtaasti käänteisiä operaatioita VEC(A). VEC(A):n tyyppistä tilannetta varten työstin sukron ensimmäistä osaa suunnassa "wide" -> "long". Lisäksi tyypittelin vielä saman suunnan kaksi eri tapausta A ja B, jossa A liittyy lähinnä aineiston pakkaustapaan, taustamuuttujia ei ole toistettu turhaan. Tyyppi A vaatii myös matriisin transponointia. Käytännössä A tulee eteen lähinnä "long" -> "wide" suunnassa, mutta sukrossa toinenkin suunta tullee sisällyttämään tyypin A. Eräitä puutteita L-W (Long to Wide) tyypin B sukrossa tällä hetkellä: 1. Jätin erityistapauksen X:iä vain yksi kpl (pitkässä muodossa), nyt vielä tekemättä, koska useamman muuttujan tilanne on kiinnostavampi ja sukro tod.näk. täytyy haaroittaa uuden aineiston muuttujien nimeämistä varten ks. seur. 2. 2. En osannut tehdä sukroa, joka nimeäisi uuden leveän aineiston muuttujat silloin, kun X:iä > 1 kpl. Nyt ne nimeytyvät 1,2,... 3. En tiennyt, miten FILE STATUKSESSA sukro poimisi tietyllä maskilla merkityt muuttujien nimet (ks. sukron täsmennykset TIME_VAR=vuosi GROUPING_VARIABLE=NO1 ja GROUP_NAMES=CASE), joita tarvitaan myöhemmässä vaiheessa. 4. Puuttuvien tietojen uudelleenkoodaus MISSING:ksi muuten valmiissa leveässä aineistossa (taaskaan en keksinyt sopivaa keinoa sukrokielellä) ks. tilanne sukron toiminnan päättyessä 5. Aineistoa osittava muuttuja täytyy edelleen olla numeerinen 1,2,...,n Eli täytyy kehitellä lisää, mutta periaatteessa toiminto suorittaa halutun muokkauksen VEC(A,k):n periaattein. Petri *........................... *KOEAINEISTO, jossa X ja Y pitää levittää SUKUP mukaan (siis ryhmiä *2 kpl) *Lähtödata: *F ILE LOAD XL* *DATA XLb *NO nimi kuntanro skno mkno vuosi SUKUP NO1 X Y * 1 Helsinki 91 101 1 v2001 Xmiehet 1.000 0.500 1.414 * 1 Helsinki 91 101 1 v2002 Xmiehet 1.000 0.600 1.516 * 1 Helsinki 91 101 1 v2003 Xmiehet 1.000 1.700 3.249 * 2 Espoo 92 101 1 v2001 Xmiehet 1.000 0.150 1.110 * 2 Espoo 92 101 1 v2002 Xmiehet 1.000 0.200 1.149 * 2 Espoo 92 101 1 v2003 Xmiehet 1.000 - - * 3 Tampere 120 130 6 v2001 Xmiehet 1.000 0.300 1.231 * 3 Tampere 120 130 6 v2002 Xmiehet 1.000 0.100 1.072 * 3 Tampere 120 130 6 v2003 Xmiehet 1.000 0.404 1.323 * 4 Vaasa 456 165 16 v2001 Xmiehet 1.000 0.400 1.320 * 4 Vaasa 456 165 16 v2002 Xmiehet 1.000 1.240 2.362 * 4 Vaasa 456 165 16 v2003 Xmiehet 1.000 0.100 - * 5 Oulu 610 188 17 v2001 Xmiehet 1.000 0.540 1.454 * 5 Oulu 610 188 17 v2002 Xmiehet 1.000 0.760 1.693 * 5 Oulu 610 188 17 v2003 Xmiehet 1.000 0.300 1.231 * 6 Kankaanpää 200 106 13 v2001 Xmiehet 1.000 0.320 1.248 * 6 Kankaanpää 200 106 13 v2002 Xmiehet 1.000 - 4.001 * 6 Kankaanpää 200 106 13 v2003 Xmiehet 1.000 0.650 1.569 * 1 Helsinki 91 101 1 v2001 Xnaiset 2.000 0.718 1.645 * 1 Helsinki 91 101 1 v2002 Xnaiset 2.000 0.566 1.480 * 1 Helsinki 91 101 1 v2003 Xnaiset 2.000 0.937 1.915 * 2 Espoo 92 101 1 v2001 Xnaiset 2.000 0.322 - * 2 Espoo 92 101 1 v2002 Xnaiset 2.000 0.043 1.030 * 2 Espoo 92 101 1 v2003 Xnaiset 2.000 0.122 1.088 * 3 Tampere 120 130 6 v2001 Xnaiset 2.000 0.170 1.125 * 3 Tampere 120 130 6 v2002 Xnaiset 2.000 - - * 3 Tampere 120 130 6 v2003 Xnaiset 2.000 0.327 1.254 * 4 Vaasa 456 165 16 v2001 Xnaiset 2.000 0.963 1.949 * 4 Vaasa 456 165 16 v2002 Xnaiset 2.000 1.434 2.702 * 4 Vaasa 456 165 16 v2003 Xnaiset 2.000 0.055 1.039 * 5 Oulu 610 188 17 v2001 Xnaiset 2.000 0.771 1.706 * 5 Oulu 610 188 17 v2002 Xnaiset 2.000 1.430 2.694 * 5 Oulu 610 188 17 v2003 Xnaiset 2.000 0.614 1.530 * 6 Kankaanpää 200 106 13 v2001 Xnaiset 2.000 0.626 1.543 * 6 Kankaanpää 200 106 13 v2002 Xnaiset 2.000 - - * 6 Kankaanpää 200 106 13 v2003 Xnaiset 2.000 0.905 1.873 * *............................... *Data XLo (kopioidaan yltä) sukron kokeilua varten! *FILE DEL XLo *FILE COPY XLb XLo *FILE SHOW XLo *.......................... *Tarvittaessa formaatin päivitys *FILE UPDATE XLo * Copy of data matrix XLb *FIELDS: (active) * 1 NA_ 1 NO (##) * 2 SA_ 10 nimi * 3 NA_ 2 kuntanro (########) * 4 NA_ 2 skno (####) * 5 NA_ 1 mkno (####) * 6 SA_ 5 vuosi * 7 SA_ 7 CASE * 8 NA_ 4 NO1 (#.###) * 9 NA_ 4 X (##.####) * 10 NA- 4 Y (##.####) *END *Survo data file XLKAKS: record=65 bytes, M1=15 L=64 M=10 N=36 *.................................. * Talleta PANEL2 sukro (alla) ensin: *FILE SHOW XLo * */PANEL2 XLo,Xwi / Xwi on uusi "leveä" data * *MASK=SSSSSTMNXX *MISSING_VALUE=-9 / korvataan puuttuvat tiedot (vapaasti valittav.) *DIRECTION=LONG / ei vielä toiminnossa *Nämä täsmennykset voidaan toiv. mukaan poistaa myöhemmin... *TIME_VAR=vuosi *GROUPING_VARIABLE=NO1 *GROUP_NAMES=vuosi *..................................... / Sukron talletus (sopivaan hakemistoon) *TUTSAVE C:\PROGRA~1\Survo\U\S\PANEL2 / /PANEL2 <data>,<newdata> /................... / Sukrokurssilla 25.11.2003 KV & co / 1.3.2004 PP... *{tempo -1}{init} / - if W1 '=' Return then goto Back / *{save stack}{W1=PANEL2}{call SUR-SAVE}{break on}{del stack}{load stack} *{line start}{erase}{erase} / - if W1 '=' ? then goto Help - if W1 '=' (empty) then goto Help - if W1 '=' <table> then goto Help - if W2 '<>' {} then goto Start *{W2=W1}{goto Start} + Help: {jump 1,1,1,1}{erase}{erase}SCRATCH{act}{R} / ******************************************************************* */PANEL <data>,<newdata> {R} *(HELP keskeneräinen, mut jotain ao. suuntaista / t. Petri) {R} *stacks (or unstacks) a panel data (a collection of both cross {R} * {R} * {R} / ********************************************************************** / def Wdata=W1 Wnewdata=W2 Wdata1=W3 WMAT_X=W5 WMASK=W6 W#N=W7 / def W#times=W8 Wapu=W9 Wx=W10 Wa=W11 WM_XTV=W12 Wmissing=W13 Wtime=W14 / def Wperiod=W15 Wosite=W16 W#osite=W17 Wdata1=W18 Wn1=W19 / def Wgrpname=W20 Wgrpno=W21 W#rows0=W22 W#timevar=W23 Ws=W24 Wtmn=W25 / def W#vars=W26 Wst=W27 Wtimevar=W28 Wgrpvar=W29 Wgrpvname=W30 / def Wconstant=W31 / ********************************************************************** *{Wx=}{goto ERRNO} / --------------------------------------------------------------------- /Aloitetaan sukro tallentamalla maskirivin tiedot + Start: {save spec MASK WMASK}{save spec MISSING_VALUE Wmissing} *{save spec TIME_VAR Wtimevar}{save spec GROUPING_VARIABLE Wgrpvar} *{save spec GROUP_NAMES Wgrpvname} / *{jump 1,1,1,1}{line start}{erase}{erase}SCRATCH{act}{home} *{form}/PANEL2 {form2}Return back to the previous work{form5}{R} / *.........................................{R} / *FILE SHOW{R} *{tempo -1} *MASK={print WMASK}{line start} *{R} *STAT {print Wdata} CUR+1,STATUS / #MASK=NSXMT{act} /Tsekataan, onko ositemuuttujia, jonka mukaan pinotaan, vain 1 kpl? /Dataa koskevat tiedot muistiin *{save spec #N W#N}{save spec #X W#vars}{save spec #M Wgrpname} *{save spec #obs W#rows0}{save spec #T W#timevar} / - if W#N = 0 then goto ERR1 - if W#N > 1 then goto ERR1 *{R}{R}{R} *..........................{R} /Tehdään kopio {print Wdata} *FILE DEL XTEMP1{act}{R} *FILE COPY {print Wdata} XTEMP1{act} *{R} *..........................{R} /Tehdään maskirivi, jossa vain S:llä merkityt aktivoitu *MASK={print WMASK}{line start} *{r5} + Ms: {save char Ws} - if Ws '=' {sp} then goto eMs - if Ws '<>' S then goto Ms1 else goto Ms2 + Ms1: -{l} + Ms2: {r} *{goto Ms} + eMs: {R} *{save spec MASK Ws} *...............................{R} /Sitten vain maskilla X merkityt rivit *MASK={print WMASK}{line start} *{r5} + Mx: {save char Wx} - if Wx '=' {sp} then goto eMx - if Wx '<>' X then goto Mx1 else goto Mx2 + Mx1: -{l} + Mx2: {r} *{goto Mx} + eMx: {R} *{save spec MASK Wx} *...........................{R} // /vain T:llä,M:llä ja N:llä merkityt merkit *MASK={print WMASK}{line start} *{r5} + Mtmn: {save char Wtmn} - if Wtmn '=' {sp} then goto eMtmn - if Wtmn '=' T then goto Mtmn2 - if Wtmn '=' M then goto Mtmn2 - if Wtmn '=' N then goto Mtmn2 else goto Mtmn1 + Mtmn1: -{l} + Mtmn2: {r} *{goto Mtmn} + eMtmn: {R} *{save spec MASK Wtmn} *...............................{R} /{tempo 2} /vain S;llä ja T:llä merkityt merkit maskirivilä *MASK={print WMASK}{line start} *{r5} + Mst: {save char Wst} - if Wst '=' {sp} then goto eMst - if Wst '=' S then goto Mst2 - if Wst '=' T then goto Mst2 else goto Mst1 + Mst1: -{l} + Mst2: {r} *{goto Mst} + eMst: {R} *{save spec MASK Wst} / / / Tässä kohtaa homma periaatteessa jakaantuu sen mukaan onko / levitettäviä X.iäo 1 tai >1 (MULTIXVARS), idea on se että leveän / aineiston X-muuttujien nimeäminen on yksinkertaista jos muuttujia = 1. / - if W#vars < 1 then goto ERR2 - if W#vars > 2 then goto MULTIXVARS + ONEXVAR: / //SAVENOW + MULTIXVARS:...................{R} /tästä lähtee varsinainen long -> wide / /Puuttuvien tietojen muuttaminen *MASK={print Wx}{R} *TRANSFORM XTEMP1 BY if(X=MISSING)then({print Wmissing})else(X){act}{R} *......................{R} /{tempo 2} /Seuraavaksi otetaan talteen aggregoitavan aineiston muuttujat{R} /MASK={print Wtmn}{R} /FILE STATUS XTEMP1{act} / *{tempo -1} *Tehdään aggregaattiaineisto, jolla tutkitaan, ovatko ositteet{R} *samankokoisia. Lisäkäyttä leveän datan X.ien nimeämisessä{R} *(ks. Wgrpvname).{R}{R} / *FILE DEL XTEMP2{act}{R} *FILE DEL AXTEMP2{act}{R} *FILE SORT XTEMP1 BY {print Wgrpvar} TO XTEMP2{act}{R} *FILE AGGR XTEMP2 BY {print Wgrpvar} TO AXTEMP2{R} *VARIABLES:{R} - if Wgrpvname '=' (empty) then goto agCASE2 *namegrp FIRST {print Wgrpvname}{R} *grpno FIRST {print Wgrpvar}{R} *ngrps N {print Wgrpvar}{R} *values1 #VALUES {print Wgrpvar}{R} *END{u6}{act}{d6}{R}{goto Endaggr} + agCASE2: *grpno FIRST {print Wgrpvar}{R} *ngrps N {print Wgrpvar}{R} *values1 #VALUES {print Wgrpvar}{R} *END{u6}{act}{d6}{R} + Endaggr: *.......................{R}{d5}{u5} *{tempo 2} / Tsekataan onko ositteet yhtä suuria ja niiden lkm: *STAT AXTEMP2,CUR+1 / VARS=ngrps{act}{save spec Constant Wconstant} - if Wconstant '=' (empty) then goto ERR3 *{save spec N W#osite}{u}{ins line}{line start}SCRATCH{act}{line start} / /Tehdään lisämuuttuja, josta muodostetaan /VAR ORDER:1=ORDER TO AXTEMP2{act} /VAR V:S1=MISSING TO AXTEMP2 /VAR str(V)="X" TO AXTEMP2 /FILE SHOW AXTEMP2 / / Tehdään Xistä matriisi *MASK={print Wx}{R}{Wn1=W#rows0/W#osite} *MAT SAVE DATA XTEMP1 TO Aw{act}{R} *MAT VkAw=VEC(Aw,{print Wn1}){act}{R} *..........................{R} / Siirretään taustamuuttujat uuteen dataan *{tempo -1} *MASK={print Wst}{R} *FILE DEL {print Wnewdata}{act}{R} *FILE COPY XTEMP1 {print Wnewdata} / IND={print Wgrpvar},1{act}{R} *...........................{R} /{tempo 2} /Sitten leveässä muodossa olevat X.t uuteen dataan *FILE SAVE MAT VkAw TO {print Wnewdata} / MATCH=#{act}{R} *....................{R} *FILE SHOW {print Wnewdata}{R} / *{R}{d2}{u2} *Sitten lopuksi muunnettava puuttuvat takaisin ks. maski{R} *{form1}MASK={R} *{form}TRANSFORM {print Wnewdata} BY if(X={print Wmissing})then(MISSING) *else(X){R}{R} *X-muuttujien uudet leveät nimet:{R} *(X1.1,...,X1.n;X2.1,...,X2.n;...;Xp.1,...,Xp.n){R} *täytyy (toistaiseksi) tehdä käsin{R} *Huom. p = muuttujien lkm., n = ositteiden lkm.{R} *...............{d4}{u5} *{goto End} * * *{goto End} / ********************************************************************** + ERR1: {Wx=Exactly one N variable required!}{goto ERRNO} + ERR2: {Wx=Exacyly one N variable required!}{goto ERRNO} + ERR3: {Wx=Groups differ by their size!}{goto ERRNO} + ERRNO: {Wa= }{Wx=Wa&Wx}{Wx=Wx& Press ENTER!}{message Wx} - on key - key _: continue - wait 600 *{message}@{goto Back} / ********************************************************************** + End1: {save stack}{W1=PANEL2}{call SUR-RESTORE}{break on}{del stack} *{load stack}{line start}{ins}{block}{block}{block}{block}{ins}{R} *{goto End} / def W1=W1 ************************************************************ + Back: {W1=PANEL2}{call SUR-RESTORE}{break on}{goto End} + End: {tempo +1}{end} *...................................................... *
Vastaukset: |
---|
Survo-keskustelupalstan (2001-2013) viestit arkistoitiin aika ajoin sukrolla, joka automaattisesti rakensi viesteistä (yli 1600 kpl) HTML-muotoisen sivukokonaisuuden. Vuoden 2013 alusta Survo-keskustelua on jatkettu entistäkin aktiivisemmin osoitteessa forum.survo.fi. Tervetuloa mukaan!