Sukrokurssi jatk: pandatan muokk. Long -> Wide

[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!

Etusivu  |  Keskustelu
Copyright © Survo Systems 2001-2013. All rights reserved.
Updated 2013-06-15.