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