Re: Toivomuksia täsmennyksistä ym.

[vastaus aiempaan viestiin]

Kirjoittaja: Kimmo Vehkalahti
Sähköposti:    -
Päiväys: 20.10.2004 9:24

Mitä tulee jutun otsikon alkuosaan ("Toivomuksia täsmennyksistä"),
toteaisin vain että kun n. 10 vuotta sitten tein ensimmäisiä
Survo-moduleitani, tulin sallineeksi täsmennysten kirjoittamisen
pienillä kirjaimilla. Myöhemmin olen sitä katunut, mutta en voi
tietenkään tekoani mennä peruuttamaankaan. Minusta on selvempää,
että täsmennykset kirjoitetaan isoilla, ja että ylipäätään isot
ja pienet kirjaimet eivät ole samanarvoisia.

"Suurpiirteisyys" ärsyttää itseäni tavattomasti mm. SPSS:ssä joka
ei erota isoja ja pieniä kirjaimia muuttujien nimissä. Toki
muuttujien nimet ovat vähän eri asia, mutta vain vähän. Kaikki
toimituskenttään kirjattu materiaali yhdessä muodostaa dokumentin
työskentelystä, ja yksi tapa selkiyttää sitä on pitää isoilla ja
pienillä kirjaimilla omat roolinsa. TEKSTIÄHÄN EI OLE VASTAAVASTI
TAPANA KIRJOITTAA ISOILLA PUUKSTAAVEILLA, se antaa amatöörimäisen
kuvan ja tulkitaan HUUTAMISEKSI. Näinkin ajateltuna ISOT KIRJAIMET
sopivat teknisiin tarkoituksiin, komentoihin ja täsmennyksiin.

Sitten otsikon loppuosaan ("ym."). :-)

Haluaisin hieman konkreettisemmin pohtia Simon/Jarkon mainitsemia
näkökohtia tulosten tallettamiseen. Koska osalle tämän keskustelun
seuraajista ei R-ohjelmisto varmaankaan ole tuttu, havainnollistan
asiaa pienellä esimerkillä.

R:ssä (ja sen esikuvassa, SPlus-ohjelmassa) tosiaankin säilötään
tuloksia talteen erilaisilla nimillä, jolloin niihin voi viitata
myöhemmissä yhteyksissä. Survossa toimitaan periaatteessa samalla
tavalla, mutta toteutustavat ovat erilaiset. Sama pätee yhtä hyvin
muihinkin tilastollisen laskennan saralla operoiviin ohjelmiin
(esim. SAS ja SPSS) - kullakin ohjelmalla on omat tapansa säilöä
tuloksia ja tarjota niitä käyttäjän ulottuville.

Katsotaan siis aluksi hieman R:n käyttöä SAVINGS-aineiston avulla,
jota on usein käytetty regressiodiagnostiikan havainnollistamisessa.

Luetaan aineisto sisään tekstitiedostosta; muuttujien nimet ovat
ensimmäisellä rivillä, maiden nimet ovat sarakkeessa "Country":

> savings <- read.table("savings.txt", header=T, row.names="Country")

Aineiston alkupäätä näkyville (tilan säästämiseksi ei koko aineistoa):

> savings[1:7,]
             SR POP15 POP75     DPI Rate
Australia 11.43 29.35  2.87 2329.68 2.87
Austria   12.07 23.32  4.41 1507.99 3.93
Belgium   13.17 23.80  4.43 2108.47 3.82
Bolivia    5.75 41.89  1.67  189.13 0.22
Brazil    12.88 42.19  0.83  728.47 4.56
Canada     8.79 31.72  2.85 2982.88 2.43
Chile      0.60 39.74  1.34  662.86 2.67

Poimitaan vain parin maan tiedot:

> savings[c("Finland","Iceland"),]
           SR POP15 POP75     DPI Rate
Finland 11.24 27.84  2.37 1681.25 4.32
Iceland  1.27 34.03  3.08 1900.10 1.12

Kiinnitytään aineistoon (lyhentää merkintöjä, kun datan nimeä ei
tarvitse toistaa) ja lasketaan lineaarinen malli funktiolla lm:

> attach(savings)
> model1 <- lm(SR ~ POP15 + POP75 + DPI + Rate)

Funktion lm tuloksena saatava model1 sisältää 12 eri kohtaa:

> names(model1)
 [1] "coefficients"  "residuals"     "effects"       "rank"
 [5] "fitted.values" "assign"        "qr"            "df.residual"
 [9] "xlevels"       "call"          "terms"         "model"

Otetaan tässä näkyville vain residuaaleja aineiston alkupäästä:

> model1$residuals[1:6]
         1          2          3          4          5          6
 0.8636672  0.6162974  2.2189380 -0.6984035  3.5528533 -0.3167252

Maiden nimet olisivat hyödyksi, mutta oletuksena ne eivät tule
mukaan model1:een, kuten näkyy:

> names(model1$residuals)[1:6]
[1] "1" "2" "3" "4" "5" "6"

Kopioidaan omatoimisesti nimet mukaan aineistosta:

> names(model1$residuals) <- row.names(savings)
> names(model1$residuals)[1:6]
[1] "Australia" "Austria"   "Belgium"   "Bolivia"   "Brazil"    "Canada"

jolloin saadaan paremmin selvää:

> model1$residuals[1:6]
 Australia    Austria    Belgium    Bolivia     Brazil     Canada
 0.8636672  0.6162974  2.2189380 -0.6984035  3.5528533 -0.3167252

Lisää tuloksia syntyy summary-funktiolla. Otetaan sen tulokset talteen
nimellä sum1:

> sum1 <- summary(model1)

Käytettävissä on 11 kohtaa:

> names(sum1)
 [1] "call"          "terms"         "residuals"     "coefficients"
 [5] "aliased"       "sigma"         "df"            "r.squared"
 [9] "adj.r.squared" "fstatistic"    "cov.unscaled"

Esimerkiksi selitysasteeseen voi viitata näin:

> sum1$r.squared
[1] 0.3384577

Mallin kertoimet muine tietoineen löytyvät osastosta "coefficients",
joka on 5x4-taulukko:

> dim(sum1$coefficients)
[1] 5 4

Sen sisältö on kokonaisuudessaan seuraava:

> sum1$coefficients
                 Estimate  Std. Error    t value     Pr(>|t|)
(Intercept) 28.5662294804 7.354502457  3.8841825 0.0003337975
POP15       -0.4611958542 0.144641765 -3.1885386 0.0026028076
POP75       -1.6914510217 1.083593487 -1.5609646 0.1255381020
DPI         -0.0003370167 0.000931094 -0.3619577 0.7190778562
Rate         0.4096888540 0.196196683  2.0881538 0.0424736185

Yksittäisiin osiin voi viitata näin:

> sum1$coefficients["POP15","Estimate"]
[1] -0.4611959

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

Vertailun vuoksi vilkaistaan asiaa Survon puolelta. En tässä tee
samoja asioita vaan ajan säästämiseksi liitän mukaan meneillään
olevan Data-analyysi II -kurssini tämän viikon harjoitustehtävien
mukana jakamani Survo-ohjeen (minulla on tyypillisesti joitakin
ohjeita useistakin ohjelmista - R, SAS, SPSS, Survo, Arc):

FILE STATUS SAVINGS
  Intercountry life-cycle savings data from
  Belsley,Kuh,Welsch(1980): Regression Diagnostics, p.41
  Each variable is an average over period 1960-1970 SORT:Country
FIELDS: (active)
   1 SA_  16 Country
   2 NA_   4 SR       aggregate personal savings rate (##.##)
   3 NA_   4 POP15    percentage of population under 15 years (##.##)
   4 NA_   4 POP75    percentage of population over 75 years (##.##)
   5 NA_   8 DPI      per-capita disposable income in USD (####.##)
   6 NA_   4 Rate     percentage growth rate of DPI (##.##)
END
Survo data file SAVINGS: record=95 bytes, M1=17 L=64  M=6 N=50

Tehdään valikoima uusia muuttujia regressiodiagnostiikkaa varten:
VAR Res,Pre,Hats,Stud,Cook,Sres TO SAVINGS
   Res=MISSING  (tavalliset residuaalit)
   Pre=MISSING  (sovite eli ennuste)
   Hats=MISSING (H-matriisin lävistäjäalkiot)
   Stud=MISSING (studentoidut residuaalit)
   Cook=MISSING (Cookin etäisyydet)
   Sres=MISSING (standardoidut residuaalit)
........................................................................
Valitaan muuttujille tehtävät ja lasketaan regressiomalli:
MASK=-YXXXXRPHSC-
REGDIAG SAVINGS CUR+1 / mallia voi tietysti tästä parantaa, ks. harj. 4
Regression diagnostics on data SAVINGS: N=50
Regressand SR        # of regressors=5 (Constant term included)
Condition number of scaled X: k=34.8683
Variable Regr.coeff. Std.dev.     t
Constant  28.566233  7.3545026     3.8842
POP15    -0.4611959  0.1446418    -3.1885
POP75    -1.6914514  1.0835935    -1.5610
DPI      -0.0003370  0.0009311    -0.3620
Rate      0.4096888  0.1961967     2.0882
Variance of regressand SR=20.07404584 df=49
Residual variance=14.46025813 df=45
R=0.5818 R^2=0.3385 Durbin-Watson=1.686

Standardoituja residuaaleja ei yleensä tarvita, jos studentoidut ovat
käytettävissä. Ne voi kuitenkin laskea itse kaavoilla (2.8) ja (2.9):

VAR Sres=Res/(s*sqrt(1-Hats)) TO SAVINGS
missä s=sqrt(variance) eli jäännöshajonta edellä lasketusta mallista.

FILE SHOW SAVINGS / FIELD=Res
........................................................................
Mitoille ominaiset rajat, kun k=4, p=k+1 ja n=50:
   Hats: 2*p/n=0.2
   Stud: abs(t.G(n-k-2,0.05/2/n))=3.5258013064872
   Cook: sqrt(0.5)=0.70710678118655
........................................................................
Eräitä tyypillisiä diagnostiikkakuvia (tähänastisten lisäksi):

VAR Nrot:2=ORDER TO SAVINGS / havaintonumerot aineistoon

  *Kuva1=H-matriisin_lävistäjäalkiot_ja_havaintonumerot
  *Kuva2=Studentoidut_residuaalit_ja_H-matriisin_lävistäjäalkiot
  *Kuva3=Cookin_etäisyydet_ja_havaintonumerot
  *Kuva4=Studentoidut_residuaalit_ja_havaintonumerot

  Asteikot: *n=0(10)50,55:_          (havaintonumerot)
   (sekä    *H=0,0.2,0.6             (H-matriisin lävistäjäalkiot)
    sopivat *S=-4,-3.53,0,3.53,4     (studentoidut residuaalit)
    rajat)  *C=-1,-0.7,0,0.7,1       (Cookin etäisyydet)

  Maiden nimet näkyviin (pienellä): POINT=[SMALL],Country

GPLOT SAVINGS Nrot Hats / HEADER=*Kuva1 XSCALE=*n YSCALE=*H GRID=Y
GPLOT SAVINGS Hats Stud / HEADER=*Kuva2 XSCALE=*H YSCALE=*S GRID=XY
GPLOT SAVINGS Nrot Cook / HEADER=*Kuva3 XSCALE=*n YSCALE=*C GRID=Y
GPLOT SAVINGS Nrot Stud / HEADER=*Kuva4 XSCALE=*n YSCALE=*S GRID=Y
........................................................................

Tuon harjoitustehtäväohjeen jatkoksi voisin mainita pari esimerkkiä:

Talletetaan diagnostiset tulokset (ja maiden nimet) matriisitiedostoon:

MASK=A-----AAAAA--
MAT SAVE DATA SAVINGS TO SDIAG

Yksittäisen alkion poimiminen kenttään tai osaksi jatkolaskelmia:

MAT_SDIAG(Libya,Hats)=0.53145605325699

Osamatriisin poimiminen kenttään:

MAT LOAD SDIAG(Finland:Iceland,Hats:Cook) CUR+1
MATRIX SDIAG
///          Hats     Stud     Cook
Finland    0.0920  -0.4599  -0.0661
France     0.1362   0.6964   0.1244
Germany_   0.0874  -0.0492  -0.0069
Greece     0.0966  -0.8597  -0.1261
Guatemal   0.0605  -0.9086  -0.1033
Honduras   0.0601   0.1905   0.0218
Iceland    0.0705  -1.7312  -0.2086

Millä havainnolla olikaan suurin studentoitu residuaali?

MAT M=MAX_IJ(SDIAG(*,Stud))     / *M~MAX_IJ(SDIAG) D1*1
MAT LOAD M
MATRIX M
MAX_IJ(SDIAG(*,Stud))
///          Stud
Zambia   2.853561

Lisää esimerkkejä matriisimuotoisten tulosten hyödyntämisestä löytyy
mm. valitsemalla DEMO -> MATRIX.

Jatkolaskelmia varten Survo siis tallettaa matriisitiedostoja ja
tekstimuotoisia tulostuksia, joista jälkimmäiset tulevat oletuksena
myös RESULTS-tiedostoon. Kuten Simo mainitsikin, sukroilla voi
jatkojalostaa näitä tuloksia sellaiseen muotoon, että tuloksiin
voi helpommin viitata jatkossa. Niistä voi koota taulukoita, ja
tallettaa näitä edelleen vaikka matriiseiksi tai datatiedostoiksi.

Matriisitiedostojen osalta tämä viittaaminen on kätevää jo valmiiksi.
Seppo mainitsi vastauksessaan:

>  "tarkat" arvot kaikista taulukkomaisista tuloksista
>  menevät tiettyihin matriisitiedostoihin, joilla on
>  vakionimet. Kysely MATRES? kertoo tiedostojen nimet.

Nämä ovat hyödyllisiä jatkolaskelmien kannalta. Olen itse ollut
aika ajoin aktiivisesti penäämässä lisää tulosmatriiseja erilaisiin
operaatioihin, ja valikoimaa voisi nähdäkseni edelleen kasvattaa.
Mm. REGDIAG voisi tallettaa parametriestimaattien (REG.M) ohella
myös niiden keskivirheet, tai paremminkin kovarianssimatriisin
samaan tapaan kuin GENREG (PCOV.M). Varmaankin myös LINREG voisi
toimia samoin. Tai sitten samaan tapaan kuin ESTIMATE (jonka ko.
[uusia] matriiseja EST*.M ei taideta mainita MATRES?-kohdassa?)

terv. Kimmo

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.