Sukrokurssi: paneelidata hallint. pinoaminen B

[viesti Survo-keskustelupalstalla (2001-2013)]

Kirjoittaja: Petri Palmu
Sähköposti:    petri.palmu'at'helsinki.fi
Päiväys: 9.12.2003 13:07

Terve,

Sukro paneeliaineistojen muokkaamiseen (pinoaminen) toisessa
"leveän" lähtötilanteessa B. Ensimmäisessä tilanteessa ongelmana
oli saada sarakemuuttujina olleet ajalliset tiedot ryhmistä (tässä
maantieteelliset alueet Suomessa) käännettyä ja pinottua pitkään
muotoon.
Nyt tilanne on se, että "aika" on jo pinottu, mutta kiinnostava
muuttuja "X" on edelleen ositettu sarakkeilla (tässä miehet, naiset).
Tavoitteena on pinota "miehet naisten päälle" niin, että kaikki
taustatiedot pysyvät mukana.

Sukron ajossa MASK-rivi on muotoa MASK=SSSSXXXX, jossa "X" on
pinottavat sarakkeet ja S:t taustatietoja. Ensimmäiseen
pinoamisvaiheeseen verrattuna tässä ei tarvita varsinaista
"osittajaa",jota merkittiin maskissa "N":llä. Kun MASK-rivillä ei ole
"N":ää. niin sukro "tajuaa", että kyseessä on "leveä" -> "pitkä"
tyyppiä B.
Homma yleistyy kuinka monelle "S" ja "X" maskilla merkitylle
muuttujalle tahansa. Yleistyksissä puutteena on edelleen se, että
ositus tapahtuu jatkuvan muuttujan (ORDER) suhteen. En tiedä sitten,
onko tämä loppujen lopuksi paha rajoitus, sillä tämän tyyppisissä
,mutkikkaammissa datoissa on joka tapauksessa hyvä olla tietty
"perusavain". Eli käyttäjä pakotetaan tekemään "leveä -> pitkä"
esimerkkidatan "NO"-muuttuja.

Sukroa seuratessa voi havaita, että mukana on vielä ylimääräistä
"sälää", jonka voi poistaa sitten lopullisessa versiosta.
Tavoitedatassa on myös numeerinen lisäositteita kuvaava muuttuja
("NO1"). Jostain syystä en saanut muuttujasta tarpeettomia desimaaleja
poies. Lisäksi uusien muuttujien nimeäminen (tässä: CASE -> sukupuol)
jäi vielä tekemättä.

Jos mahdollista, niin tätä kannattaa kokeilla laajoilla datoilla, jossa
ositteita alkudatassa on paljon sekä vaaka- että pystysuunnassa. Sukron
suoritusajan voisi toki myös kellottaa. Hitaimmat vaiheet liittyvät
FILE COPY toiminnon toistoon.

Ilmoitelkaahan jos ei toimi....

Petri


......................................
Lähtötilanne:

 SS SSS        SSSSSSSS SSSS SSSS SSSSS   XXXXX  XXXXXX

DATA XWide2
 NO nimi       kuntanro skno mkno vuosi   Xmiehet Xnaiset
  1 Helsinki         91  101    1 v2001   0.500   0.718
  1 Helsinki         91  101    1 v2002   0.600   0.566
  1 Helsinki         91  101    1 v2003   1.700   0.937
  2 Espoo            92  101    1 v2001   0.150   0.322
  2 Espoo            92  101    1 v2002   0.200   0.043
  2 Espoo            92  101    1 v2003       -   0.122
  3 Tampere         120  130    6 v2001   0.300   0.170
  3 Tampere         120  130    6 v2002   0.100       -
  3 Tampere         120  130    6 v2003   0.404   0.327
  4 Vaasa           456  165   16 v2001   0.400   0.963
  4 Vaasa           456  165   16 v2002   1.240   1.434
  4 Vaasa           456  165   16 v2003   0.100   0.055
  5 Oulu            610  188   17 v2001   0.540   0.771
  5 Oulu            610  188   17 v2002   0.760   1.430
  5 Oulu            610  188   17 v2003   0.300   0.614
  6 Kankaanpää      200  106   13 v2001   0.320   0.626
  6 Kankaanpää      200  106   13 v2002       -       -
  6 Kankaanpää      200  106   13 v2003   0.650   0.905


........................

TAVOITEDATA:
FILE LOAD XL
DATA XL*,A,B,C
 NO nimi       kuntanro skno mkno vuosi CASE       NO1       X
  1 Helsinki         91  101    1 v2001 Xmiehet  1.000   0.500
  1 Helsinki         91  101    1 v2002 Xmiehet  1.000   0.600
  1 Helsinki         91  101    1 v2003 Xmiehet  1.000   1.700
  2 Espoo            92  101    1 v2001 Xmiehet  1.000   0.150
  2 Espoo            92  101    1 v2002 Xmiehet  1.000   0.200
  2 Espoo            92  101    1 v2003 Xmiehet  1.000       -
  3 Tampere         120  130    6 v2001 Xmiehet  1.000   0.300
  3 Tampere         120  130    6 v2002 Xmiehet  1.000   0.100
  3 Tampere         120  130    6 v2003 Xmiehet  1.000   0.404
  4 Vaasa           456  165   16 v2001 Xmiehet  1.000   0.400
  4 Vaasa           456  165   16 v2002 Xmiehet  1.000   1.240
  4 Vaasa           456  165   16 v2003 Xmiehet  1.000   0.100
  5 Oulu            610  188   17 v2001 Xmiehet  1.000   0.540
  5 Oulu            610  188   17 v2002 Xmiehet  1.000   0.760
  5 Oulu            610  188   17 v2003 Xmiehet  1.000   0.300
  6 Kankaanpää      200  106   13 v2001 Xmiehet  1.000   0.320
  6 Kankaanpää      200  106   13 v2002 Xmiehet  1.000       -
  6 Kankaanpää      200  106   13 v2003 Xmiehet  1.000   0.650
  1 Helsinki         91  101    1 v2001 Xnaiset  2.000   0.718
  1 Helsinki         91  101    1 v2002 Xnaiset  2.000   0.566
  1 Helsinki         91  101    1 v2003 Xnaiset  2.000   0.937
  2 Espoo            92  101    1 v2001 Xnaiset  2.000   0.322
  2 Espoo            92  101    1 v2002 Xnaiset  2.000   0.043
  2 Espoo            92  101    1 v2003 Xnaiset  2.000   0.122
  3 Tampere         120  130    6 v2001 Xnaiset  2.000   0.170
  3 Tampere         120  130    6 v2002 Xnaiset  2.000       -
  3 Tampere         120  130    6 v2003 Xnaiset  2.000   0.327
  4 Vaasa           456  165   16 v2001 Xnaiset  2.000   0.963
  4 Vaasa           456  165   16 v2002 Xnaiset  2.000   1.434
  4 Vaasa           456  165   16 v2003 Xnaiset  2.000   0.055
  5 Oulu            610  188   17 v2001 Xnaiset  2.000   0.771
  5 Oulu            610  188   17 v2002 Xnaiset  2.000   1.430
  5 Oulu            610  188   17 v2003 Xnaiset  2.000   0.614
  6 Kankaanpää      200  106   13 v2001 Xnaiset  2.000   0.626
  6 Kankaanpää      200  106   13 v2002 Xnaiset  2.000       -
  6 Kankaanpää      200  106   13 v2003 Xnaiset  2.000   0.905

...............................
Data XW2 Sukron kokeilua varten!
FILE DEL XW2
FILE COPY XWide2 XW2
FILE SHOW XW2
..........................

FILE STATUS XW2
 Copy of data matrix XWide2
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 NA_   4 Xmiehet  (###.###)
   8 NA_   4 Xnaiset  (###.###)
END
Survo data file XW2: record=56 bytes, M1=14 L=64  M=8 N=18

...................................
Talleta sukro PANEL ensin!!
FILE SHOW XW
FILE ACT XW2

MASK=SSSSSSXX     /  pinoaminen tyyppiä "B"
MISSING_VALUE=-9 / korvataan puuttuvat tiedot (vapaasti valittav.)
/PANEL XW2,XL      / , jossa tässä XW=lähtödata,WL=tavoitedata
DIRECTION=LONG    / ei vielä toiminnossa

FILE SHOW XL
...................
/
*TUTSAVE PANEL
/ /PANEL <data>,<newdata> 
/ Sukrokurssilla 25.11.2003 KV & co
*{tempo -1}{init}
/
- if W1 '=' Return then goto Back
/
*{save stack}{W1=PANEL}{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}
*section and time-series data) in a wide (or long) format to      {R}
*a new Survo data file by a given grouping variable. The sucro    {R}
*may be useful in certain data prehandling situations, where       {R}
*the data is not in a ready-to-analyse form (so that X's and Y's   {R}
*are the variables in the columns and the observations by          {R}
*individuals, groups etc. and the time (periods) are in the rows). {R}
*                                                                  {R}
*Two main directions in the reshaping are:                         {R}
*                                                                  {R}
*1) "wide" to "long"                                               {R}
*2) "long" to "wide"                                               {R}
*                                                                  {R}
*1):                                                              {R}
*In the direction "wide" -> "long" MASK=NSSSSXXXX specifies       {R}
*how the (long) data is stacked                                   {R}
*                                                                 {R}
*"N" = a variable by which the stacking is                        {R}
*      carried out (so far only VAR ...=ORDER works)              {R}
*"S" = other group spesific (like an area code or name) variables {R}
*                                                                 {R}
*"X" = the target variable in different time periods to be       {R}
*    stacked.                                                    {R}
*                                                                 {R}
*2): "long" to "wide" puuttuu toistaiseksi...                     {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
/
/ *******************************************************************
*{Wx=}{goto ERRNO}
/ ---------------------------------------------------------------------
/Aloitetaan sukro tallentamalla maskirivin tiedot
+ Start: {save spec MASK WMASK}{save spec MISSING_VALUE Wmissing}
/
*{jump 1,1,1,1}{line start}{erase}{erase}SCRATCH{act}{home}
*{form}/PANEL {form2}Return back to the previous work{form5}{R}
/
*.........................................{R}
/
*FILE SHOW{R}
/
*MASK={print WMASK}
*{R}
*STAT {print Wdata} CUR+1,STATUS / #MASK=NSX{act}
/Tsekataan, onko ositemuuttujia, jonka mukaan pinotaan, vain 1 kpl?
*{save spec #N W#N}{save spec #X W#times}{save spec #obs Wn1}
- if W#N = 0 then goto STACKB
- if W#N > 1 then goto ERR1
*{R}{R}{R}
*.......................{R}{R}{R}
/
/
/ Muunnetaan puuttuvat tiedot (määrätään sukro-komennossa)
/{tempo 2}
*MASK={print WMASK}{line start}
*{r5}
+ Ma: {save char Wx}
- if Wx '=' {sp} then goto eMa
- if Wx '<>' X then goto Ma1 else goto Ma2
+ Ma1: -{l}
+ Ma2: {r}
*{goto Ma}
+ eMa: {R}
*STAT {print Wdata} CUR+1,STATUS / #MASK=NSX{act}
*{save spec #act W#times}{save spec #obs W#osite}{R}
*{R}{R}{R}{R}{R}{R}
*........................{R}
/Tehdään lähtödatasta kopio (apudataw), jotta alkuperäisen lähtödatan
/puuttuvat tiedot (-) eivät muutu.
*apudataw{l3}{save word Wdata1}{R}
*FILE DEL {print Wdata1}{act}{R}
*FILE COPY {print Wdata} {print Wdata1}{act}{home}{u6}SCRATCH{act}{R}
*TRANSFORM {print Wdata1} BY if(X=MISSING)then({print Wmissing})
*else(X){act}{R}
*.......................................{R}{R}
/
/ aineisto maskilla "X" merkittyjen osalta matriisiksi
/
/{tempo 2}
*MASK={print WMASK}{line start}
*{r5}
+ Mb: {save char Wx}
- if Wx '=' {sp} then goto eMb
- if Wx '=' S then goto Mb1
- if Wx '=' N then goto Mb1 else goto Mb2
+ Mb1: -{l}
+ Mb2: {r}
*{goto Mb}
+ eMb: {R}
/
*MAT SAVE DATA {print Wdata1} TO {WMAT_X=X}{print WMAT_X}{act}{R}
*MAT LOAD {print WMAT_X},END+2{R}
*FILE SHOW {print Wdata1}{R}
/ Otetaan matriisista transpoosi
*MAT {print WMAT_X}T={print WMAT_X}'{act}{R}
/ Pinotaan arvot VEC-toiminnolla
*MAT {WM_XTV=XTV}{print WM_XTV}=VEC({print WMAT_X}T){act}
*{R}
/
*..............................{R}
/ Otetaan Aikamuuttuja (CASE) talteen
*FILE DEL {print WMAT_X}T{act}{R}
*FILE SAVE MAT {print WMAT_X}T TO {print WMAT_X}T{act}{R}
*FILE SHOW {print WMAT_X}T{R}
*...................................{R}{R}{R}
/ Luodaan uuden datan pohja vanhasta jättämällä maskilla X
/ merkityt pois
/{tempo 2}
*MASK={print WMASK}{line start}
*{r5}
+ Mc: {save char Wx}
- if Wx '=' {sp} then goto eMc
- if Wx '<>' X then goto Mc2 else goto Mc1
+ Mc1: -{l}
+ Mc2: {r}
*{goto Mc}
+ eMc: {R}
*{R}
*FILE DEL {print Wnewdata}{act}{R}
*FILE STATUS {print Wdata1}{act}{home}{next word}{erase}
*CREATE {print Wnewdata}{act}{home}{erase}SCRATCH{act}{R}
/
/
/{tempo 2}
*T={print W#times}{R}
/Ositteiden taustatietojen (maskissa "N" ja "S") kopiointi
/pitkään aineistoon: aikasarjahavaintojen lkm. / osite
/
*{Wperiod=0}{Wosite=0}
+ NextGRP: {Wperiod=0}{Wosite=Wosite+1}
+ CopyGinfo: {Wperiod=Wperiod+1}
- if Wperiod > W#times then goto nextG
- if Wosite > W#osite then goto L
*{line start}{erase}
*FILE COPY {print Wdata1} TO {print Wnewdata} / IND=NO,{print Wosite}
*{act}{goto CopyGinfo}
+ nextG: {goto NextGRP}
+ L: {R}FILE SHOW {print Wnewdata}{R}
*........................{R}
/{tempo 2}
/ Vuosimuuttujan kopiointi x ositteiden lkm.
*FILE DEL Xvuodet{act}{R}
*{Wosite=0}
+ Aloita: {Wosite=Wosite+1}
- if Wosite >  W#osite then goto Valmis
*FILE COPY XT Xvuodet   / VARS=CASE{act}{home}{erase}{goto Aloita}
+ Valmis: {R}
*FILE SHOW Xvuodet{R}
*...........................{R}
/ Pohjustetaan vuosimuuttuja uuteen dataan
/{tempo 2}
*VAR CASE:S8=MISSING TO {print Wnewdata}{act}{R}
*FILE SHOW {print Wnewdata}{R}
*.........................{R}
/ liitetään vuosimuuttuja uuteen dataan
*FILE COPY Xvuodet {print Wnewdata} / VARS=CASE / MATCH=#{act}{R}
*.........................{R}
/ X-muuttujan liittäminen uuteen dataan
*MAT XTV(0,1)="X"{act}{R}
*FILE SAVE MAT XTV TO {print Wnewdata} / MATCH=#{act}{R}
*......................................{R}
/ Palautetaan puuttuvat tiedot takaisin "-":ksi
*TRANSFORM {print Wnewdata} BY if(X={print Wmissing})
*then(MISSING)else(X) / VARS=X{act}{R}
/
*FILE SHOW {print Wnewdata}{d6}{u6}{R}{R}
*{form5}The new data{form6} {write Wnewdata}:{R}
*Number of groups (n) = {print W#osite}{R}
*Number of time obs. per group (T) = {print W#times}{R}
*{form1}Row total obs. (n x T) = {write W#osite}*{write W#times}={act}
*{R}{goto End}
/
/ Ollaan toisessa pinoamistilanteessa, jossa ryhmittäiset tiedot
/ ositteista ja ajassa ovat leveässä muodossa.
/
/ *****************************************
+ STACKB: {R}{R}{R}
/
*.........................{R}
*FILE DEL {print Wdata}b{act}{R}
*FILE COPY {print Wdata} TO {print Wdata}b{l2}{save word Wdata1}{r2}
*{act}{R}
*FILE SHOW {print Wdata1}{R}
*.......................{R}
/
/Ositetaustatietojen kopioiminen omaksi dataksi
/{tempo 2}
*MASK={print WMASK}{line start}
*{r5}
+ MASK_S: {save char Wx}
- if Wx '=' {sp} then goto endSMASK
- if Wx '<>' X then goto ennall1 else goto passivoi1
+ passivoi1: -{l}
+ ennall1: {r}
*{goto MASK_S}
+ endSMASK: {R}X-ositteita: {print W#times}
*{R}
/
*FILE DEL taustat2{act}{R}
/Luuppi joka kopioi S taustatiedot maskilla X merkittyjen muuttujien lkm
*{Wperiod=0}{line start}{erase}FILE COPY {print Wdata1} taustat2
+ SCOPY: {Wperiod=Wperiod+1}{act}
/
- if Wperiod = W#times then goto endSCOPY
*{goto SCOPY}
/
+ endSCOPY: {R}
*FILE SHOW taustat2{R}
/
/ Puuttuvien tietojen korvaaminen
*.................................{R}
*
/{tempo 2}
*MASK={print WMASK}{line start}
*{r5}
+ XMASK: {save char Wx}
- if Wx '=' {sp} then goto endXMASK
- if Wx '<>' X then goto passivoi2 else goto ennall2
+ passivoi2: -{l}
+ ennall2: {r}
*{goto XMASK}
+ endXMASK: {R}
*TRANSFORM {print Wdata1} BY if(X=MISSING)then({print Wmissing})
*else(X){act}{R}
/
*MAT SAVE DATA {print Wdata1} TO {WMAT_X=X}{print WMAT_X}{act}{R}
*MAT LOAD {print WMAT_X},END+2{R}
*FILE SHOW {print Wdata1}{R}
/Pinotaan arvot VEC-toiminnolla
*MAT VEC_{print WMAT_X}=VEC({print WMAT_X}){act}{R}
/Nimetään sarakkeet ja otetaan luokittelijanimet talteen
*MAT VEC_{print WMAT_X}(0,1)="X"{act}{R}
*MAT Xlab={print WMAT_X}(1,)'{act}{R}
*MAT Xlab(0,1)="NO1"{act}{R}
*MAT LOAD VEC_{print WMAT_X},END+2{R}
*n_alkudata: {print Wn1}{R}
/
/Seuraavaksi kopioidaan X:n uudet taustatiedot datan #obs
*........................{R}
*FILE DEL GnameX{act}{R}
*FILE SAVE MAT Xlab TO GnameX{act}{R}
/
/VAR NO1:2=MISSING TO GnameX{act}{R}
*VAR NO1:2=ORDER TO GnameX{act}{R}
*FILE SHOW GnameX{R}
/Sitten tehdään luuppi joka toistaa GnameX n = #obs kertaa
/
/
*FILE DEL GnameX1{act}{R}
*{Wapu=0}{line start}{erase}FILE COPY GnameX GnameX1
+ GXLuuppi: {Wapu=Wapu+1}{act}
/
- if Wapu = Wn1 then goto Loppu2
*{goto GXLuuppi}
/
/
+ Loppu2: {R}
*FILE DEL GnameX2{act}{R}
*FILE SORT GnameX1 BY NO1 TO GnameX2{act}{R}
*FILE SHOW GnameX2{R}
/
/
*....................{R}
*
/Liitetään taustatiedot, sukupuoli ja x-muuttuja yhteen
/taustat2 GnameX2 X
*FILE DEL {print Wnewdata}{act}{R}
*FILE COPY taustat2 {print Wnewdata}{act}{R}
*FILE SHOW taustat2{R}
*VAR CASE:S8=MISSING TO {print Wnewdata}{act}{R}
*VAR NO1=MISSING TO {print Wnewdata}{act}{R}
*VAR X=MISSING TO {print Wnewdata}{act}{R}
*....................{R}
*FILE COPY GnameX2 {print Wnewdata} / VARS=CASE,NO1 / MATCH=#{act}{R}
*....................{R}
/X-muuttujan liittäminen uuteen dataan
/
*FILE SAVE MAT VEC_{print WMAT_X} TO {print Wnewdata} / MATCH=#{act}{R}
*......................{R}
*FILE SHOW {print Wnewdata}{R}
/
/Palautetaan puuttuvat tiedot viivaksi (-)
*TRANSFORM {print Wnewdata} BY if(X={print Wmissing})
*then(MISSING)else(X) / VARS=X{act}{R}{R}
/
/
*..........................{R}{R}{R}{d8}{u8}
*FILE STATUS {print Wnewdata},CUR+1 / VARS{sp}=CASE{act}{line start}
/{next word}UPDATE{line start}{u1}{ins line}
/REPLACE "CASE ","LEVEL",CUR+3,END{act}
*
*
/SUCRO?
*
*
*
*
*
*
*
*
*
*{goto End}
/ **********************************************************************
+ ERR1: {Wx=Exactly one N variable required!}{goto ERRNO}
/ ERR2: {Wx=Only 2}{Wx=Wx&-dimensional tables allowed!}{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=PANEL}{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=PANEL}{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.