Re: Syksyn 2003 sukrokurssi jatkuu verkossa

[vastaus aiempaan viestiin]

Kirjoittaja: Petri Palmu
Sähköposti:    petri.palmu'at'helsinki.fi
Päiväys: 4.12.2003 2:43

Moi vaan!

Sukrokurssi oli kerrassaan mainio! Ennen kurssia en kunnolla edes
tiennyt, mikä sukro on. Lisäksi ajattelin, että Survon käytön
opettelussa mulla raja menee varmasti poikki juuri ennen sukroihin
"sekaantumista". Nyt ajatukset ovat muuttuneet täysin, sukrot ovat
mielestäni Survon toiminnan ydin, niitä ilman ei (ikävä kyllä)
taida tulla toimeen, jos todella haluaa ottaa Survosta hyödyn irti.
Tarve esim. luuppeihin tulee yllättävän aikaisessa vaiheessa:
"Kuinka paljon aikaa sitä onkin hukkaantunut, kun on joutunut
muuttelemaan IND, CASES ja SELECT täsmennyksiä manuaalisesti
eri tilanteissa?" Nyt tiedän, että STAT-operaation voi ajaa vaikka
50 ryhmälle erikseen muutamassa sekunnissa aivan yksinkertaisella
sukrolla.

Toisaalta sukrojen teko on mielestäni yksi parhaista (ellei paras)
tavoista opetella Survon käyttöä, koska sukroissa (ei välttämätön)
perusajatus on tehdä kulloinenkin vaihe mahdollisimman vähin elein,
siis valita minimaaliset (mutta riittävät) toiminnot, jotka
halutun lopputuloksen tuottavat. Tämä johtaa automaattisesti
siihen, että Survossa valmiina olevia eri toimintoja vertaillaan
kussakin ongelmatilanteessa, esim. "Menisikö tämä paremmin
käyttämällä välillä matriiseja vai löytyykö datatiedostoon liittyvistä
toiminnoista jokin yhtä hyvä keino?" Samallahan sitä kuin huomaamatta
oppii lisää Survosta noin erityisesti ja yleisesti.

Tässä oli muutama pinnalla ollut ajatus, lisää tulee vielä varmasti.
Ja kurssihan on - kuten Kimmon otsikossa lukee - vielä kesken :)

Petri P.

Alla on paneeliaineistojen muokkaamiseen tarkoitettu sukro, joka ei
pikkujouluissa suostunut toimimaan oikealla tavalla.
Sukro ei vielä käsitä kaikkia temppuja, joita olen sen harteille
ajatellut kannettavaksi, mutta nyt toiminnassa oleva ominaisuus on
perustavaalaatua.
Kimmolta (V.) sain ratkaisevaa apua sukron työstämisessä.
Mahdollisista toimintahäiriöstä vastaa allekirjoittanut - tietty
poislukien testaajan koneen väärästä kokoonpanosta yms. johtuvat
viat :)

*SAVE PANEL1 /  paneeliaineistojen pyöritystä
*
*
* - save esim. data / esimerkkiaineiston tallentaminen editorikentästä
* - tutsaveen / Sukron talletus
* - aloita_panelsukro /
*
*ESIMERKKI:
*- Tietoja yhdestä muuttujasta "X" eräistä Suomen kunnista
*vuosina 2001-2003
*- Riveillä on kaikki taustatieto ositteesta (kunnan nimi,
*kunta-, seutukunta- ja maakuntakoodi) ja X:n arvot eri vuosina
*(V2001,...).
*- Kiusana on joitakin puuttuvia tietoja (-)
*
*Ongelma: Kuinka päästään lähtötilanteesta, ns. leveä muoto, "pitkään"
*muotoon, jossa X-arvot on ositteittain pinottu (allekkain). Mitään
*ositteisiin liittyvää taustatietoa ei saa hävitä.
*
*Alkutilanne (kuusi aluetta & kolme vuotta):
*
*DATA Xwide
*NO nimi       kuntanro skno mkno v2001 v2002 v2003
*1  Helsinki     91     101  1    0.5   0.6   0.7
*2  Espoo        92     101  1    0.15  0.2    -
*3  Tampere     120     130  6    0.3   0.1   0.4
*4  Vaasa       456     165  16   0.4   0.2   0.1
*5  Oulu        610     188  17   0.54  0.76  0.3
*6  Kankaanpää  200     106  13   0.32   -    0.65
*
*Tätä tavoitellaan :)
*
*DATA Xlong
* NO nimi       kuntanro skno mkno vuosi     X
*  1 Helsinki         91  101    1 v2001   0.500
*  1 Helsinki         91  101    1 v2002   0.600
*  1 Helsinki         91  101    1 v2003   0.700
*  2 Espoo            92  101    1 v2001   0.100
*  2 Espoo            92  101    1 v2002   0.200
*  2 Espoo            92  101    1 v2003       -
*  3 Tampere         120  130    6 v2001   0.300
*  3 Tampere         120  130    6 v2002   0.100
*  3 Tampere         120  130    6 v2003   0.400
*  4 Vaasa           456  165   16 v2001   0.400
*  4 Vaasa           456  165   16 v2002   0.200
*  4 Vaasa           456  165   16 v2003   0.100
*  5 Oulu            610  188   17 v2001   0.540
*  5 Oulu            610  188   17 v2002   0.760
*  5 Oulu            610  188   17 v2003   0.300
*  6 Kankaanpää      200  106   24 v2001   0.321
*  6 Kankaanpää      200  106   24 v2002       -
*  6 Kankaanpää      200  106   24 v2003   0.654
*
*............................
* - save esim. data /
*Tee DATA Xwide:sta Survon datatiedosto XW !
*FILE DEL XW
*FILE COPY Xwide TO XW
*...........................
*F ILE DEL Xlong1
*F ILE COPY Xlong Xlong1
*
*FILE SHOW XW
*F ILE SHOW Xlong1
*.........................
*FILE STATUS XW
* Copy of data matrix Xwide
*FIELDS: (active)
*   1 NA_   1 NO       (##)
*   2 SA_  10 nimi
*   3 NA_   2 kuntanro (########)
*   4 NA_   2 skno     (####)
*   5 NA_   1 mkno     (####)
*   6 NA_   4 v2001    (##.##)
*   7 NA_   4 v2002    (##.##)
*   8 NA_   4 v2003    (##.##)
*END
*Survo data file XW: record=55 bytes, M1=14 L=64  M=8 N=6
*
*/PANEL ?      / helppiin  (keskeneräinen)
*
*.......................................................................
* - tutsaveen /
/
*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}
*The two main directions 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 Wx=W10 Wa=W11 WM_XTV=W12 Wmissing=W13 Wtime=W14
/ def Wperiod=W15 Wosite=W16 W#osite=W17 Wdata1=W18
/
/ *******************************************************************
*{Wx=}{goto ERRNO}
/ ---------------------------------------------------------------------
/Aloitetaan sukro tallentamalla maskirivin tiedot
+ Start: {save spec MASK WMASK}{save spec MISSING_VALUE Wmissing}
*ollaan siis toisen editorikentän alussa
*{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}
- 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:S12=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}
/ **********************************************************************
+ 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}
*
*
*.......................................................................
* - aloita_panelsukro /
*
*FILE SHOW XW
*FILE ACT XW
*
*MASK=NSSSSXXX     /
*MISSING_VALUE=-1 / korvataan puuttuvat tiedot (vapaasti valittav.)
*/PANEL XW,XL      / , jossa tässä XW=lähtödata,WL=tavoitedata
*
*FILE SHOW XL
*...................
*Eräitä huomioita sukrosta:
*- toistaiseksi on olemassa vain suunta "leveä" -> "pitkä"
*- maskilla "N" merkattavan muuttujan tulee olla (toistaiseksi)
*rivin järjestysnro: VAR xxxx=ORDER
*.....................
*
*
*
*

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.