Clt255 Tilastomenetelmät - Wikimuistiinpanot

Tänne voi vapaasti kommentoida tehtäviä, esittää R:ää ja kurssia koskevia kysymyksiä ja ehdottaa omia ratkaisuja. -- SeppoNyrkko - 2009-09-16

kurssin sivulle

Kurssityön ohje

Raportin suositeltava mitta on yhteensä 3-10 sivua + liitteet. Osa työstä voi olla kokeilevassa muodossa, esimerkiksi podcast, multimediaesitys tai demo-ohjelma.

Työn ei ole tarkoitus olla niinkään laaja, vaan oivaltava.

Suositeltava ajankäyttö n. 27...40 h (~ 1...1,5 op)

Esimerkkiaiheita

  • Asiasanalista, jossa esitellään kurssin aiheita esimerkkien, kuvien ja lähteiden avulla
  • Referoiva työ
    • Aiheita esim: tilastollinen jäsentäminen tai konekääntäminen, käännösmuistit, tiedonlouhinta
  • Sanaluokan esiintymismäärän (frekvenssin) ennustus lineaarimallilla (tai muuten)
  • ANOVA-testi (monisteen esimerkin tai demon pohjalta)
  • HMM-sovellus (demon pohjalta)
  • Sanavektoreihin perustuva sovellus (demon pohjalta)
  • Zipf-sanarank-yhteensopivuustestaus
  • Oma aihe

Esimerkkiaineistoja

  • Forsyten taru FDG-jäsennettynä (kurssin sivulla)
  • Project Gutenberg
  • Käytännössä mikä tahansa muu aineisto, josta löytyy tutkimushypoteesi ja riittävästi dataa

Palautettava työ

Malli palautettavasta työstä: HyClt255s2009mallityo

Raportin rakenne voi olla vaikkapa seuraava:

1. Johdanto- ja esittelyosuus:

  • Esitellään työn aihe
    • Mitä ja miksi tehdään (Motivaatio)
    • Hypoteesit
    • Esimerkkejä
    • Aineisto
  • Taustaa
    • Työn kannalta oleellisia kurssin aiheita, esimerkkejä ja lainauksia
    • Muoto voi olla esim. asiasanalista, käsitekartta (mind map), tai "leikekirja"

2. Mittaus- ja tutkimusosuus:

  • Miten tehdään
    • Menetelmät, tavoite
  • Kokeilut ja tulokset
    • Selostus itse tehdystä mittauksesta
    • Mittaukset
  • Tulkintaa, pohdintaa
    • Tulosten analyysi
    • Pohdinta

3. Lähdeosuus

  • viittauksia istunnoilla käytettyihin tai muuten löytyneisiin tiedon ja aineiston lähteisiin
  • muuten aihetta käsittelevää kirjallisuutta, artikkeleita

Faktoritesti (ANOVA), esimerkki:

Kurssilla aiemmin suosittu tutkimustyyppi on tarkastella 2 tai useammassa aineistossa ilmeneviä käsin valittavia termejä ja joitakin niiden piirteitä (esim. ylätyylisyys, sukupuoli). Piirteiksi käyvät myös fdg-jäsentimien tuottamat analyysit -- tosin tällöin jäsentimen toimintaperiaatteet tulee ottaa huomioon tuloksia arvioitaessa.

Tutkimustyössä voidaan testata näiden jakautumista eri tekstiosiin. Esimerkiksi ANOVA-faktoritestillä voidaan selvittää, onko aineistojen tai tekstiosien välillä tilastollisesti merkitseviä eroja termien piirteiden kesken.

Myös yksi aineisto voidaan jakaa useaksi aineistoksi, esim. alku- ja loppupuoleen esimerkiksi sanaindeksin avulla.

Alkuun pääsee esimerkiksi laatimalla seuraavanlaisen taulukon jonka voi syöttää R:lle read.table-käskyllä:

Chapter Term ylatyyli pos nimi
1 fortune 1 N 0
2 disreputable 0 A 0
2 aged 0 A 0
3 proficient 1 A 0
3 soames 0 N 1

(termit ja piirteet tietysti valittuna oman hypoteesin perusteella)

Lopuksi voidaan tehdä hypoteesien testaukset aov-funktion avulla

> read.table("malli.txt",header=T)->aineisto
> summary(aov(ylatyyli ~ nimi + (Chapter>2)))

            Df  Sum Sq Mean Sq F value Pr(>F)
nimi         1 0.20000 0.20000     0.6 0.5196
Chapter > 2  1 0.33333 0.33333     1.0 0.4226
Residuals    2 0.66667 0.33333
Yllä olevan analyysi: Tilastollisesti ei löytynyt ylätyylisyyden määrän vaihteluun piirteistä "nimi" tai "Chapter>2".

Demo: Zipf-sanarank (18.12.2009)

Datan valmistelu (word-muuttujaan on luettu teoksen sanat alusta loppuun)

> table(word)->wordfreq
> rankword<-unlist(labels(sort(wordfreq,decreasing=T)))
> theor.freq<-(1 / (1:length(wordfreq)))

Nyt sanat on järjestetty esiintymisfrekvenssin mukaan:

> wordfreq[rankword[1:20]]
word
  the    of     a   and    to    he   had   was   his    in   her  with  that 
  272   234   172   150   134   103    91    90    89    89    68    55    54 
  for     I    it  they  said their  were 
   49    48    46    45    38    36    36 

Graafinen frekvenssien tarkastelu osoittaa mielenkiintoisen korrelaation mahdollisuuden rankin ja frekvenssin välillä:

> plot(wordfreq[rankword[1:100]],log="y")
> plot(theor.freq,wordfreq[rankword],log="xy")
> plot(wordfreq[rankword]/theor.freq,log="x")

Yhteensopivuustesti voidaan tehdä khiin neliön avulla:

> chisq.test(wordfreq[rankword[1:20]],p=theor.freq[1:20],rescale.p=T)
... p-value < 2.2e-16

> chisq.test(wordfreq[rankword[4:20]],p=theor.freq[4:20],rescale.p=T)
... p-value = 0.5856

Demo: Neuraalilaskentaa 11.12.2009

Pääkomponenttianalyysi (PCA)

Pääkomponenttianalyysi (PCA) on eräs autokorrelaation matriisin ominaisarvojen ja ominaisvektoreiden suoraviivainen sovellus. Se poimii aineistosta suurimman varianssin omaavat komponentit ja pienen hajonnan kohinakomponentit erilleen.

Tilastollisesti eniten merkitsevä informaation osa ilmenee ensimmäisissä pääkomponenteissa, ja vastaavasti pienin vaihtelu (oletettavasti virhekohinaa) jää viimeisiin pääkomponentteihin.

PCA:n tuottamat komponentit minimoivat päällekkäisen informaation, ts. pääkomponenttivektorit ovat kohtisuorassa toisiaan kohden, kuten ominaisarvohajotelmassa tapahtuu.

> attach(forsyte)
> xtabs(~asent+pos)->spos
> detach(forsyte)
> spos/rowSums(spos)->nspos
> prcomp(nspos[1:200,])->spca
> biplot(spca)
> biplot(spca,choice=3:4)

Ensimmäisten pääkomponenttien määrittämän graafisen jakauman perusteella voidaan havaita aineistosta erityisellä tapaa kiinnostavia ja poikkeavia lauseita. Esimerkiksi lause 256:

> word[asent==256]
[1] I        know     nothing  about    anybody  nobody   tells    me
[9] anything

Itseoppiva kartta (SOM)

> install.packages("som")
> library(som)
> som(nspos[1:200,],6,6)->nspossom
> plot(nspossom)

Luettavaa

  • WebSOM: "http://websom.hut.fi/websom/stt/doc/fin/"
  • ICA, independent component analysis: "http://www.cis.hut.fi/projects/ica/"
  • PCA, principle component analysis: "http://ordination.okstate.edu/PCA.htm"

R-muistiinpanoja

map-konstruktio R:ssä


# funktion mäppäys arvolistalle

> sapply(1:10,sqrt)
 [1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751 2.828427
 [9] 3.000000 3.162278

> sapply(c("john","mary"),function(x)(sprintf ("hello %s!",x)))
         john          mary 
"hello john!" "hello mary!" 


> kertoma<-function(x){if(x>1){x*kertoma(x-1)}else{1}}
> sapply(c(5,6), kertoma)
[1] 120 720

# vaihtoehto colSums-funktiolle 

> m<-matrix(1:16,nr=4,nc=4)

> apply(m, 2, sum)
[1] 28 32 36 40

# ... ja sama riveille

> apply(m, 1, sum)
[1] 10 26 42 58

Aloitus laajemmalle Forsyte Saga -aiheiselle ANOVA-testille

otetaan työstettävää penkkiin

read.table("Documents/Rdata/forsyte.txt",header=T)->forsyte
attach(forsyte)

Rajoitutaan nyt max 3 pitkiin rakenteisiin, i olkoon ikkunaiteraattori

hahmonpit <- 3
i <- (1:(length(lemma)-hahmonpit+1))

indeksit valitaan niin että +0 on determinerin paikka, +1 on attribuutin tai muun apusanan paikka ja +2 on pääasanan paikka.

Sitten joitakin mielenkiintoisia konstruktioita:

  • (DET) old | young N
  • (DET) väri N
  • X old Jolyon


cOld<-     (lemma[i+1]=="old")
cYoung<-   (lemma[i+1]=="young")
cOldN<-     (lemma[i+1]=="old" & pos[i+2]=="N")
cYoungN<-   (lemma[i+1]=="young" & pos[i+2]=="N")
cDetOldN<-  (pos[i]=="DET" & lemma[i+1]=="old" & pos[i+2]=="N")
cDetYoungN<-(pos[i]=="DET" & lemma[i+1]=="young" & pos[i+2]=="N")
cDetColorN<-  (pos[i]=="DET" &
            pos[i+2]=="N" & 
            (lemma[i+1]=="red" | lemma[i+1]=="green" | 
           lemma[i+1]=="yellow" | lemma[i+1]=="blue" | 
           lemma[i+1]=="brown") )
cJolyon<-  (lemma[i+2]=="jolyon")
cOldJ<-    (lemma[i+1]=="old" & lemma[i+2]=="jolyon")

samalla tehtiin vähän ylimääräistä (tutki, kokeile ja räjäytä -periaate) smile



# tutkitaan vaikkapa "DET young N" -konstruktiota käsin

which(cYoungN)->ii
data.frame(word[ii],word[ii+1],word[ii+2],chp[ii])


# samoin tutkitaan "DET väri N" -konstruktiota

which(cDetColorN)->ii
data.frame(word[ii],word[ii+1],word[ii+2],chp[ii])


# "teoksen loppupuoli" tai "lauseen alku" -faktori 
# vaikuttanee joihinkin frekvensseihin,
# otetaan siis nämä faktoreiksi ja analysoidaan anovalla
# (44 on puoliväli)

fEnd       <- chp[i]>44
fSentBegin <- sidx[i+2]<4 

summary(aov(cOld ~ fEnd))
summary(aov(cOld ~ fEnd * fSentBegin))
summary(aov(cOldJ ~ fEnd))

summary(aov(cDetColorN ~ fEnd * fSentBegin))


# tutkitaan vielä omin silmin missä vanha Jolyon esiintyykään

library(MASS)
truehist(chp[which(cOldJ)],h=1)

... ja lopuksi löydetään hyvät hypoteesit sekä tarkastellaan argumentteja vielä kehäpäätelmien yms. varalta:

Topic revision: r11 - 2009-12-18 - SeppoNyrkko
 
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2018 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback