Segamudelid 1. praktikum Mida vähem andmeid, seda parem? (Üldistatud vähimruutude meetod ja heteroskedastilised andmed) Segamudelite praktikumides kasutame R-tarkvara. Kahel aastal on teostatud ühe füüsikalise nähtuse uurimiseks mõõtmiseid. Teooria järgi peaks kahe mõõdetud näitaja (x ja y) vahel olema lineaarne seos, y = c 0 + c 1 x + e. Eelkõige huvitab meid, kas seos tunnuste vahel üldse eksisteerib (H 1 : c 1 0) ja milline see seos siis on, kui ta ikkagi on olemas (soovime võimalikult täpset hinnangut parameetrile c 1 ). Loeme R-i mõõtmistulemusi sisaldava andmestiku: load(url("http://www.ms.ut.ee/mart/sega2013/segaandmed1.rdata")) ja saame esmase ülevaate andmetest: head(andmed); dim(andmed) attach(andmed) table(aasta) plot(x,y) Hindame ka soovitud mudeli: m1=lm(y~x) summary(m1) confint(m1) Paraku selgub, et kogutud andmed ei luba nullhüpoteesi kummutada ja x-tunnuse mõju olemasolu ei saa tõestada (p-väärtus: 0.696), usaldusintervall kordaja c 1 tegelikule väärtusele tuleb lai ja sisaldab ka nulli (95%-UI: -0,37..0,56). Veendume veel igaks juhuks, ega aastal pole mõju (võimalikud vead katseparatuuri kalibreerimises): m2=lm(y~x+factor(aasta)) summary(m2) Tulemus peaks tulema ootuspärane aastal mõju puudub. Ega me ju ei ootakski, et uuritav füüsikaline nähtus ajas muutuda võiks... Kas siis kuidagi saaks hinnangut täpsemaks teha ja seose olemasolu tõestada? Ehk on probleemiks liigsed andmed? Ehk saame täpsema hinnangu, kui viskame 2/3 andmetest analüüsist minema? Mis peaks hinnanguga ja tema täpsusega juhutuma, kui viskame osa andmeid minema? Proovime, kuidas on lood tegelikkuses: m3=lm(y~x, data=andmed[101:150,]) summary(m3); confint(m3)
Näeme, et hinnang on muutunud märgatavalt täpsemaks (vaata standardvigu), usaldusintervall on märkimisväärselt kitsam ja meid huvitav kordaja on muutunud statistiliselt oluliseks. Seega vähem andmeid viib praktikas täpsema tulemuseni? Uurime toimunut veidi lähemalt. Esmalt märkame, et andmestiku sabaotsas on uuemad vaatlused: table(aasta[101:150]) ja paneme tähele, et y-tunnuse varieeruvus on 2013 märksa väiksem kui 1987.a., kuid x- tunnuse varieeruvus pole märkimisväärselt muutunud: by(y, aasta, sd) by(x, aasta, sd) Võime oletada, et järsku on y-tunnuse mõõtmistäpsus aja jooksul suurenenud (jah, nüüd tuleb meelde 1987 sai kasutatud üsna põlveotsas kokkupandud mõõteaparatuuri, tänapäeval on aga meie käsutuses üks maailma täpsemaid täppismõõteriistu...). Seega on 1987.a. tehtud vaatlused ebatäpsed (vastavate jääkide dispersioon on suur), aastal 2013 tehtud vaatlused aga täpsed (vastavate mudeli jääkide dispersioon on väike). Üks võimalus oleks muidugi kasutada vaid täpseid vaatluseid aga kahju on siiski 2/3 vaatlustest niisama minema visata. Kas oleks võimalik neid ebatäpseid vaatluseid ka kuidagi mõistlikult kasutada veelgi täpsema hinnangu saamiseks? Selleks on kaks võimalust.
Meetod I. Metaanalüüs (nn fikseeritud mõjudega metaanalüüsi mudel) Hindame kaks eraldi mudelit: üks mudel täpsetele mõõtmistele, teine mudel ebatäpsetele vaatlustele. Märgime üles saadud hinnangud ja nende täpsuse ning hiljem kombineerime saadud hinnangud üheks täpsustatud hinnanguks. Täpsed (2013.a. tehtud) mõõtmised: > m3=lm(y~x, data=andmed[aasta=="2013",]) > summary(m3) Coefficients: Estimate Std. Error t value Pr(> t ) (Intercept) 7.7510 0.6914 11.21 5.26e-15 *** x 0.2718 0.1114 2.44 0.0184 * Ebatäpsed (1987.a. tehtud) mõõtmised: > m4=lm(y~x, data=andmed[aasta=="1987",]) > summary(m4) Coefficients: Estimate Std. Error t value Pr(> t ) (Intercept) 10.54018 2.15268 4.896 3.85e-06 *** x 0.00155 0.34693 0.004 0.996 Mõlemad hinnatud c 1 väärtused (y 1 =0,2718 ja y 2 =0,00155) on ühe ja sama tegeliku c 1 nihketa hinnangud, st y 1 = c 1 + e 1 ja y 2 = c 1 + e 2. Teame, et De 1 = 0,1114 2 = 0,0124 ja De 2 = 0,34693 2 = 0,12036 (tegemist on muidugi kõigest tegeliku dispersiooni hinnangutega, mitte aga tegelike dispersioonide endaga. Aga hetkel ignoreerime seda pisikest erinevust ja teeme näo, nagu me teaksime neid dispersioone täpselt). Kasutame üldistatud vähimruutude meetodit otsitava kordaja c 1 hindamiseks. # Vaatlusvektor: y = c(0.2718, 0.00155) # täpsemalt saaks käsuga: y=c(coef(m3)[2], coef(m4)[2]) # Mudeli maatriks: X = rbind(1,1) # Kovariatsioonimaatrkis V (Selgita, miks kasutame just sellist kovariatsioonimaatriksit!) disp = c(0.0124, 0.12036) # Täpsemalt saaks käsuga: disp=c(vcov(m3)[2,2], vcov(m4)[2,2]) V = diag(disp); V # Hindame parameetrid üldistatud vähimruutude meetodil (õige vastus: 0,2465...): beeta = solve( t(x) %*% solve(v) %*%... beeta pöördmaatriks transponeerimine maatrikskorrutis Täida ise!!!
Järgnevalt leiame ka kombineeritud hinnangu täpsuse (hinnangu dispersiooni ja standardvea) ning testime hüpoteesipaari H 0 : c 1 =0 vs H 1 : c 1 0. Esmalt hinnangu dispersioonist: ˆ β = D ˆ β = = = = ( X V X) X V Y D{ ( X V X) X V Y} ( X V X) X V D{ Y} V X( X V X) ( X V X) X V V V X( X V X) ( X V X) 1 Leia, milline tuleb sinu poolt leitud hinnangu ( c ˆ1= 0,2465... ) dispersioon ja standardhälve (standardviga). Dispersiooni saab leida käsuga:... Hinnangu dispersioon:... Hinnangu standardviga:... Võrdle saadud standardviga ainult täpseid vaatluseid kasutava analüüsiga. Kas meie hinnang on muutunud täpsemaks? Testime järgnevalt hüpoteesipaari H 0 : c 1 =0 vs H 1 : c 1 0. Hinnang βˆ on (vähemalt ligikaudu) normaaljaotusega juhuslik suurus (kas oskad põhjendada, miks?): ˆ ~ ( ; ˆ cˆ 1 β N β Dβ ). Seega kui H 0 : c 1 =0 kehtib, on c ˆ1 ~ N(0; Dcˆ 1) ehk ~ N(0;1 ). Dcˆ 1 Vaatame, kas antud valimis nähtud üldistatud vähimruutude hinnang käitub ootuspäraselt kas oleme saanud hinnanguks väärtuse, mida oleksime võinud näha H 0 kehtides? Otsus: kummutame H 0 / jääme H 0 juurde Leia ka p-väärtus (nii ekstreemse sedavõrd nullist erineva või veel ekstreemsema hinnangu saamise tõenäosus juhul, kui kehtib H 0 ):... Kommentaar: sageli võib leida teaduskirjandusest erinevaid teadustöid, kus on uuritud sama nähtust: sama ravimit, sama füüsikalist protsessi vms. Vahel tekib soov erinevate teadlaste tulemusi kombineerida saamaks võimalikult täpset ühist hinnangut uuritavale parametrile ehk teostada nn meta-analüüsi. Ülaltoodud meetod on üheks enamkasutatavaks meta-analüüsi läbiviimiseks kasutatavaks meetodiks (sobib juhul, kui hinnatav effekt peaks olema täpselt samasugune kõigis uuringutes).
Meetod II. Üldistatud vähimruutude meetod esialgsete andmete peal Võime anda ka kohe käsu, mis lubab erinevatel aastatel tehtud vaatlustel olla erineva täpsusega (mudeli jääkide dispersioon võib igal vaatlusaastal olla erinev). Selleks vajame lisamoodulis nlme peituvat funktsiooni gls: > library(nlme) ja vähimruutude meetodi kasutamine: > m=gls( y~x, weights=varident(1, ~1 factor(aasta)), data=andmed ) Hinnatav lineaarne mudel Erinevatel aastatel tehtud vaatlustele (vastavatele jääkidele) hinnatakse erinev dispersioon > summary(m) Generalized least squares fit by REML Model: y ~ x Data: andmed AIC BIC loglik 976.4529 988.4418-484.2265 Variance function: Structure: Different standard deviations per stratum Formula: ~1 factor(aasta) Parameter estimates: 1987 2013 1.0000000 0.2270158 Coefficients: Value Std.Error t-value p-value (Intercept) 8.011626 0.6583295 12.169630 0.0000 x 0.246589 0.1060994 2.324135 0.0215 Residual standard error: 9.969441 Degrees of freedom: 150 total; 148 residual Aastal 2013 tehtud mõõtmiste standardhälve on 0,227 korda väiksem kui 1987.a. tehtud mõõtmiste standardhälve. Kõigi andmete pealt hinnatud mudel (üldistatud vähimruutude meetodil): y = 8,011626 + 0,246589 + e Vabadusastmete arv (mida kasutatakse ka p-väärtuse leidmisel). Üldistatud vähimruutude meetodi puhul leidub sobivamaid meetodeid vabadusastmete arvu leidmiseks kui R-i poolt kasutatav, aga erinevus leitud p-väärtuste vahel on enamasti tühine (R i poolt kasutatav vabadusastmete arv on liiga suur ja R i poolt raporteeritavad p-väärtused on seetõttu tsipake väiksemad kui nad olema peaksid). Võrdlusgrupis (aastal 1987 tehtud mõõtmiste korral) on jääkide standardhälve 9,969...
Funktsiooni gls abil hinnatud jääkide hajuvused on veidi täpsemad kui need hinnangud, mida saaksime jääkide hajuvust kahes vaatluste grupis eraldi hinnates (kuna ühist keskväärtust on võimalik täpsemalt hinnata). Kuna hinnangud jääkide hajuvusele on teistsugused, siis tuleb ka tulemuseks veidi teistsugune hinnang mudeli parameetritele. Kontrolli, kas kasutades glsfunktsiooni abil leitud jääkide hajuvusi saame ka käsitsi arvutades tulemuseks samad hinnangud otsitava mudeli parameetritele (ja samad standardvead!): # Y-tunnuseks on kõigi 150 vaatluse väärtuseid sisaldav vektor: Y=y # Mudeli maatriks sisaldab seekord kahte veergu vabaliikme ja x-i jaoks: X=cbind(1, x) # Edasi jätka juba ise: V=... beeta=... Dbeeta=... Alternatiivina saame x-tunnuse vajalikkust kontrollida ka kahe mudeli võrdlemise teel: kas lihtsam mudel on sama hea kui keerulisem: # Keerulisem, x-tunnust sisaldav mudel: m1=gls( y~x, weights=varident(1, ~1 factor(aasta)), data=andmed, method="ml") # Lihtsam, ainult vabaliiget sisaldav mudel: m2=gls( y~1, weights=varident(1, ~1 factor(aasta)), data=andmed, method="ml" ) # Mudelite võrdlus: anova(m1, m2) Ülesanne Loe sisse järgmine andmestik: load(url("http://www.ms.ut.ee/mart/sega2013/palgaandmed.rdata")) head(palgaandmed) Soovitakse teada, kas keskmine palk maakonniti on erinev: m=lm(palk~factor(maakond)) drop1(m, test="f") fligner.test(palk~factor(maakond)) Soovija tahaks, et erinevused oleksid tõestatavad. Ehk saad teda kuidagi, oma statistikusüdametunnistust rikkumata aidata?