[vastaus aiempaan viestiin]
Kirjoittaja: | Kimmo Vehkalahti |
---|---|
Sähköposti: | - |
Päiväys: | 16.2.2005 19:46 |
Teki mieli jatkaa vielä hieman rivi- ja sarakeotsikoista. Otan Sepon esitelmästä http://www.helsinki.fi/survo/matrix99.html regressioanalyysiin liittyvän esimerkin (suomenkieliset tekstit ovat minun lisäyksiäni): International statistics (Source: Statistics Finland) Variables: Life Life expectancy in years, 1997 GDP Gross Domestic Product per Capita (US $), 1997 Growth Population Growth, %/year, 1996-1997 *MATRIX WORLD12 W /// Life GDP Growth Constant * China 70 0.860 1.0 1 * Finland 77 24.790 0.3 1 * France 78 26.300 0.4 1 * Hungary 71 4.510 -0.4 1 * Japan 80 38.160 0.3 1 * Mexico 72 3.700 1.7 1 * Nigeria 54 0.280 2.9 1 * Romania 69 1.410 -0.2 1 * Sweden 79 26.210 0.1 1 * Turkey 69 3.130 1.7 1 * UK 77 20.870 0.4 1 w USA 76 29.080 0.9 1 Talletetaan aineisto matriisimuotoon ja erotetaan siitä selitettävä muuttuja Life vektoriksi Y ja selittäjät (ml. vakio) matriisiksi X. Tästä näkyy myös miten otsikoita voi käyttää viitattaessa matriisien eri osiin: MAT SAVE WORLD12 MAT Y!=WORLD12(*,Life) MAT X!=WORLD12(*,GDP:Constant) Lasketaan regressiokertoimien vektori B tavanomaisella kaavalla: MAT B=INV(X'*X)*X'*Y MAT LOAD B MATRIX B INV(X'*X)*X'*Y /// Life GDP 0.3078 Growth -3.4502 Constant 70.6838 B:n ilmiasusta selviää kaikki oleellinen: Life-muuttujaa on selitetty GDP- ja Growth-muuttujilla sekä malliin kuuluvalla vakiotermillä. Pohjana ovat X- ja Y-nimiset matriisit, joista lopputulos on saatu matriisin sisäisen nimen kertomalla tavalla. Vilkaistaan sitten miten sama tehtävä sujuu R:llä. SAVEP W,w,world12.txt / talletetaan tiedot tekstimuodossa siirtoa varten > world12 <- as.matrix(read.table("world12.txt", header=TRUE, row.names=1)) > y <- world12[,"Life"] > X <- world12[,c("GDP","Growth","Constant")] > library(nlme) > b <- solve(t(X) %*% X) %*% t(X) %*% y > b [,1] GDP 0.3078164 Growth -3.4502111 Constant 70.6837861 Lopputulos on lukujen ja riviotsikoiden osalta sama kuin Survossa. Sisäisen nimen käsitettä ei R:n matriisiobjekti tunne. Jostain syystä sarakeotsikko "Life" ei siirry y:hyn, joten se ei näin ollen periydy myöskään b:hen. Jos se sinne asetetaan komennolla > colnames(y) <- "Life" niin se periytyy myös b:hen, mutta ideahan olisi juuri mahdollisimman automaattisessa otsikoiden periytymisessä, joka Survossa toimii hyvin. Edeltä nähdään myös, että otsikoilla viittaaminen onnistuu R:ssä, joskaan ei yhtä kätevästi kuin Survossa. Jos ajatellaan yleisemminkin käyttöliittymää koskevia aspekteja, niin väkisinkin huomio kiintyy R:n notaation kompleksisuuteen: transpoosin ja etenkin skalaaritulon merkinnät saavat peruskaavatkin näyttämään aika konstikkailta. Vai mitä sanotte yhdestä lineaaristen mallien kehikossa yleisimpiin kuuluvasta konstruktiosta ("matriisin transpoosi kertaa matriisi itse"): yleinen Survo R X'X X'*X t(X) %*% X ("yleinen" tarkoittaa ohjelmista riippumatonta matriisinotaatiota; vaihtoehtona transpoosipilkulle käytetään myös yläindeksiä T tai t) Survon matriisitulkin notaatiossa vain kertolaskun eksplisiittinen esiintuominen merkillä '*' erottaa sen yleisestä. R:ssä transpoosi on tehtävä funktiolla t(), sillä heittomerkki on varattu muihin tehtäviin R:n komentotulkissa. Pelkkä '*' on puolestaan varattu jostain syystä matriisien alkiokohtaiseen kertolaskuun (!), ja niinpä tilastollisissa tarkasteluissa huomattavasti yleisempi skalaaritulo on saanut operaattorikseen peräti kolmimerkkisen rakennelman '%*%'. Jälleen on joidenkin mielestä kyse pienistä, merkityksettömistä asioista, mutta mielestäni ne eivät ole lainkaan merkityksettömiä. Huono notaatio haittaa luettavuutta ja lisää kirjoitusvirheitä. Pieneltä tuntuvat asiat muuttuvat kertautuessaan yhä suuremmiksi. - 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!