Afsnit 6.4: Analyse i R

Den ensidede variansanalysemodel (Statistisk Model 6.2.3) analyseres i R med funktionerne lm, summary og confint, som er beskrevet i afsnit 5.4. Modelformlen, der bruges, er 'x~G', hvor GG er en faktor, der deler data op i grupper, og xx er en vektor med responsværdierne. Se det skjulte punkt nedenfor.
For at forstå parametertabellen er det vigtigt at kende den parametrisering, som anvendes i beregningerne. For modellen i 6.2.3, med kk grupper, faktorniveauerne 1,2,,k1,2,\ldots,k og tilhørende middelværdiparametre μ1,,μk,\mu_1,\ldots,\mu_k, benyttes i forbindelse med modelformlen 'x~G' følgende parametrisering og navngivning.
Parameterμ1μ2μ1μ3μ1μkμ1R(Intercept)G2G3Gk \begin{array}{lccccc} \hline \text{Parameter} & \mu_1 & \mu_2-\mu_1 & \mu_3-\mu_1 & & \mu_k-\mu_{1} \\ \hline \textbf{R} & \text{(Intercept)} & \text{G2} & \text{G3} & \cdots & \text{Gk} \\ \hline \end{array}
Vi kan se, at i parametertabellen bruges intercept, svarende til det første niveau af faktoren, og derefter forskelle mellem parametre, hvilket ofte vil være af større interesse end parameterværdierne selv. Det tt-test, der står i parametertabellen ud for et faktorniveau, bliver således et test for at forskellen i parameterværdi er nul, eller sagt på en anden måde et test for, at de to parameterværdier er ens. På tilsvarende vis er konfidensintervallerne for forskel i parameterværdier. (Bemærk iøvrigt, at i tilfældet med to grupper vil analysen her betragte forskellen μ2μ1,\mu_2-\mu_1, hvorimod t.test fra afsnit 4.13 betragter μ1μ2.)\mu_1-\mu_2.)

Forstå parametrisering i R

I nedenstående kodevindue laves en analyse med lm, hvor spredningen σ\sigma er nul, hvorfor estimaterne bliver lig med de sande værdier af parametrene. Kør kommandoerne, og sørg for at forstå output i parametertabellen i forhold til de sande værdier af μA,μB,μC\mu_A,\mu_B,\mu_C og σ.\sigma.

Forklaring

I output er Intercept=μA,\text{Intercept}=\mu_A, GB=μBμA\text{GB}=\mu_B-\mu_A og GC=μCμA.\text{GC}=\mu_C-\mu_A. Vi kan også udtrykke dette omvendt: μA=Intercept,\mu_A=\text{Intercept}, μB=Intercept+GB\mu_B=\text{Intercept+GB} og μC=Intercept+GC.\mu_C=\text{Intercept+GC}. I parametriseringen bruges en leksikografisk ordning af niveauerne i faktoren G,G, således at intercept svarer til "A".

Prøv at lægge mere og mere støj på data ved at vælge sigma=0.5, sigma=1 og sigma=2. Bemærk, hvordan pp-værdierne stiger i de tre t-t\text{-}test i parametertabellen.
Hvis man vil ændre på, hvilken gruppe R bruger som Intercept, kan man benytte funktionen relevel. Hvis kommandoen G=relevel(G,"C") indsættes lige efter definitionen af GG i ovenstående kode, vil Intercept blive μC.\mu_C. Prøv dette.

Hvis man ønsker, at lm skal bruge parametriseringen med μ1,μ2,,μk\mu_1,\mu_2,\ldots,\mu_k i stedet for forskelle i parameterværdierne, kan dette gøres med kaldet lm(x\simG-1). I modelformlen undertrykker "-1" brugen af et intercept.

6.4.1 Test af modelreduktion i R

Vi vil generelt udtrykke os på den måde, at vi tester en reduktion fra en model M1M_1 til en model M2M_2, hvis vi tester en hypotese, der bringer os fra model M1M_1 til model M2.M_2. I dette afsnit vil model M1M_1 være den ensidede variansanalysemodel 6.2.3, og model M2M_2 er modellen (6.2.1), hvor alle middelværdierne er ens. For at beregne FF-testet for denne reduktion skal man benytte funktionen anova i R. Input til denne er output fra to kald af estimationsfunktionen, nemlig output fra analyse af model M1M_1 og output fra analyse af model M2.M_2. Hvis vi betegner de to output med lmUD1 og lmUD2 bliver kaldet (bemærk, at lmUD2 står før lmUD1)
anova(lmUD2,lmUD1)
I tilfældet med model M2M_2 fra (6.2.1), hvor alle observationerne har samme middelværdi, foregår analysen med kaldet lm(x\sim1). For at teste at alle middelværdierne er ens, bliver kaldet til anova:
anova(lm(x\sim1),lm(x\simG))
Output fra anova er en Testtabel. Denne har 2 rækker og 7 søjler. Strukturen er som følger.
Res.DfRSSDfSum of SqFPr(>F)12 \begin{array}{rrrrrrr} \hline & \text{Res.Df} & \text{RSS} & \text{Df} & \text{Sum of Sq} & \text{F} & \text{Pr(>F)} \\ \hline 1 & - & - & & & & \\ 2 & - & - & - & - & - & -\\ \hline \end{array}
Søjlen RSS indeholder SSD(M)\mathit{SSD}(M) for de to modeller, og Res.Df de tilhørende frihedsgrader. Til beregning af FF-testet skal vi bruge s2(M1,M2),s^2(M_1,M_2), som fremkommer som (Sum of Sq)/Df,\text{(Sum of Sq)}/\text{Df}, hvor Df kan beregnes som differensen mellem de to værdier under Res.Df, og Sum of Sq kan beregnes som differensen mellem de to værdier under RSS (dette beskrives nøjere i afsnit 6.7). Søjlen FF indeholder FF-teststørrelsen s2(M1,M2)/s2(M1),s^2(M_1,M_2)/s^2(M_1), og søjlen Pr(>F) angiver den tilhørende pp-værdi beregnet fra en F(Df,Res.Df[2])F(\mathit{Df},\mathit{Res.Df}[2])-fordeling.

6.4.2 Analyse af data omkring metoder til håndvask

For datasættet beskrevet i starten af afsnit 6.2 lader vi bakti\text{bakt}_i være bakterietallet for den ii'te måling og lader metodei\text{metode}_i være den tilhørende metode til håndvask. Vi betragter Statistisk Model 6.2.3, her skrevet som
BaktiN(μmetodei,σ2),i=1,,32, \text{Bakt}_i\sim N\big(\mu_{\text{metode}_i},\sigma^2\big),\enspace i=1,\ldots,32,
hvor middelværdiparametrene og σ2\sigma^2 kan variere frit. Kør følgende kode for at få lavet en parametertabel for modellen.

6.4.1 Parametertabel i ensidet variansanalyse

Eftersom niveauet "antibakspray" kommer først i en leksikografisk ordning, er Intercept i parametertabellen μ^antibakspray=37.50.\hat\mu_{\text{antibakspray}}=37.50. Skønnet over forskellen mellem at bruge antibakteriel sæbe (antisaebe) og antibakteriel spray er μ^antisaebeμ^antibakspray=55.00,\hat\mu_{\text{antisaebe}}-\hat\mu_{\text{antibakspray}}=55.00, som står i rækken "metodeantisaebe". I samme række ses, at pp-værdien er 0.0067 for et tt-test af, at forskellen i middelværdi er nul (de to middelværdier er ens). Da pp-værdien er langt under 0.05, tyder data altså på en forskel i de to metoder til håndvask. Hvis I erstatter "summary" med "confint", kan I se, at 95%-konfidensintervallet for forskel mellem de to middelværdier er [16.5,93.5].[16.5,\,93.5]. Dette er et bredt interval, hvilket afspejler, at der kun er 8 observationer i hver gruppe og spredningen i bakterietallet fra dag til dag er stort: skønnet over spredningen er s(M1)=37.55.s(M_1)=37.55.
Parametertabellen indeholder tre tt-test for forskel i middelværdier. Hvis nu de tre pp-værdier alle havde været 0.06, skulle vi så konkludere, at data ikke strider mod at alle fire middelværdier er ens? Svaret er nej, for eksempel kunne μ^2\hat\mu_2 ligge over μ^1\hat\mu_1 og μ^3\hat\mu_3 kunne ligge under μ^1,\hat\mu_1, og så ville data tyde på en forskel mellem μ2\mu_2 og μ3.\mu_3. For at teste hypotesen om ens middelværdier
μantibakspray=μantisaebe=μsaebe=μvand, \mu_{\text{antibakspray}}=\mu_{\text{antisaebe}} =\mu_{\text{saebe}}=\mu_{\text{vand}},
benyttes kommandoen anova som vist i den følgende kode.

6.4.2 Teste middelværdier ens med anova

Genfind FF-teststørrelsen og pp-værdien fra afsnit 6.3 i testtabellen. Beregn også s2(M1)s^2(M_1) ud fra tallene i testtabellen.

Test dig selv

Betragt igen analysen af modellen, hvor hver gruppe har sin egen middelværdi.
Beregn ud fra parametertabellen skøn over de fire middelværdier. Kør så koden igen, hvor du tilføjer "-1" lige efter "metode" i modelformlen for at kontrollere dine beregninger.
Hvis vi gerne vil se forskellen mellem at bruge enten sæbe eller at bruge antibakteriel sæbe, tilføjer vi kommandoen metode=relevel(metode,"saebe") lige efter linjen, hvor metode indskrives, således at "saebe" bliver brugt som Intercept. Prøv dette. Er den antibakterielle sæbe bedre end almindelig sæbe?

Svar: Bedre sæbe

Fra output fra summary under indgangen metodeantisaebe ses, at skøn over forkellen μantisaebeμsaebe\mu_{\text{antisaebe}}-\mu_{\text{saebe}} er -13.5, og et tt-test, for hypotesen at denne forskel er nul, giver en pp-værdi på 0.48. Den observerede forskel er derfor ikke stor nok, til at vi kan påvise en forskel i middelværdi.

6.4.3 Om brugen af lm og dataframes

Ofte indlæses data fra en csv-fil, og den indlæste struktur i R er en dataframe. Vi kan danne variable i R ud fra søjlerne i denne dataframe og bruge disse variable i kaldet af lm. Dette har dog lidt karakter af "at gå over åen efter vand". I stedet kan man i kaldet af lm bruge søjleoverskrifterne som navne på variable, hvis man samtidigt tilføjer i kaldet, at data ligger i den indlæste dataframe. Dette er vist i kodevinduet nedenfor, hvor vi efterligner en indlæst dataframe ved at danne en dataframe ud fra de indskrevne data. I den første analyse betragtes alle data, hvorimod i den anden analyse betragtes en delmængde opnået ved at bruge subset kommandoen i R.

Bruge dataframe i lm

Se opstartskoden (til/fra)

ForegåendeNæste