Afsnit R.6: Statistik

R.6.1 Simulere stokastiske variable

I statistik vil vi ofte simulere data for at se, hvordan disse opfører sig under idealiserede forhold. Dette kan være noget så simpelt som at se, hvad der sker, når vi kaster en "fair" terning. Som et eksempel kan vi undersøge, hvor ofte summen af antal øjne på to terninger er større end eller lig med 9. Vi vil derfor gerne kunne få R til at kaste terningerne for os. Man taler om at generere tilfældige tal (random number generator). Følgende tabel viser nogle af mulighederne i R.
Som et første eksempel vil jeg svare på det spørgsmål, der blev stillet ovenfor i forbindelse med kast af to terninger. Jeg vil kaste de to terninger 10000 gange og se, hvor stor en andel af disse hvor summen af antal øjne er større end eller lig med 9. De 10000 kast af den ene terning genereres med sample(6,10000,replace=T), hvor "6" angiver, at de mulige udfald er svarende til en terning, og "10000" siger, at der skal laves en vektor med 10000 tilfældige udfald.

 > x=sample(6,10000,replace=T) # 1.terning kastes 10000 gange
 > y=sample(6,10000,replace=T) # 2.terning kastes 10000 gange
 > z=x+y                       # sum af antal øjne i de 10000 kast
 > sum(z>=9)/10000             # andel med sum >=9

Som et andet eksempel vil jeg simulere -teststørrelsen fra afsnit 4.4 og sammenligne med -fordelingen. Teststørrelsen er på formen hvor er antallet af observationer, er gennemsnittet af disse, og er den empiriske varians.

 > n=10
 > nSim=1000000
 > xbar=rnorm(nSim,0,1/sqrt(n))
 > s2=rchisq(nSim,n-1)/(n-1)
 > t=xbar/sqrt(s2)

 > sum(abs(t)>qt(0.975,n-1))/Nsim
 [1] 0.050297

R.6.2 Fordelingsfunktioner og fraktiler

I R kan man finde fordelingsfunktionen, det vil sige sandsynligheden for at ligge til venstre for et punkt, for alle standard fordelinger. Disse er navngivet ved bogstavet p (p står for probability) efterfulgt af navnet på fordelingen. De vigtigste kan ses i listen herefter. De tilsvarende funktioner for at finde fraktiler i en fordeling fremkommer ved at erstatte det indledende p med q (q står for quantile). Ved en standard normalfordeling kan man udelade mu=0 og sigma=1 i kaldet til pnorm.

 > pnorm(1.96,0,1)
  [1] 0.9750021

 > pnorm(1.96)
  [1] 0.9750021

 > pchisq(5.99,2)
  [1] 0.9499634

 > qchisq(0.95,2)
  [1] 5.9914645

R.6.3 Beskrivende statistik

For en vektor med observerede dataværdier beregner man ofte forskellige beskrivende mål. Tabellen nedenfor gengiver de mest almindelige.
For at få en direkte fornemmelse af fordelingen kan man lave et histogram. I R gøres dette med funktionen hist. Denne funktion laver som default en histogramfigur og danner en struktur, hvorfra antallene i de forskellige intervaller kan findes.
Hvis er en vektor med dataværdierne, kan man enten skrive
hist(x)ellerhist(x,breaks=Nint)ellerhist(x,breaks=endePkt)
I den første version beslutter R sig selv for en inddeling af aksen, der dækker alle observationerne. I den anden version specificerer man antallet Nint af intervaller, og i den sidste version angiver man en vektor endePkt med intervalendepunkter (alle værdierne i skal være indeholdt i de angivne intervaller, ellers får man en fejlmeddelelse). For et interval fra til tæller R antallet af observationer med I de to første versioner, samt i den tredje hvis intervallerne defineret gennem endePkt alle har samme længde, laver R et antalshistogram, hvor højden på kasserne angiver antallet af observationer i intervallerne. For at få et tæthedshistogram, således at det samlede areal under kasserne er 1, skal man tilføje probability=TRUE til kaldet af hist.
Man kan sætte sine egne titler på akserne og figuren ved brug af xlab, ylab og main som i beskrivelsen af plot. For at få antallene i hvert interval kan man skrive
antal=hist(x,breaks=endePkt)counts
hvorefter antallene ligger i vektoren antal.

R.6.4 Goodness of fit test

Et jordstykke er delt op i 100 lige store områder. I hvert af disse områder er der plantet 50 ærter, og der registreres hvor mange af disse, der spirer og vokser op. De målte antal betegnes Nedenfor laves et histogram med intervallængde 2 og efterfølgende et goodness of fit test for, om data kan beskrives med en binomialfordeling. Metoden er omtalt i afsnit 3.4

 > x =c(31,34,31,35,37,35,37,25,32,35,33,40,31,34,30,37,41,34,36,
   31,28,33,40,28,32,31,39,34,38,34,35,36,36,32,36,35,38,40,
   37,42,38,37,33,34,35,36,37,32,36,39,32,37,28,34,33,31,36,
   41,38,32,33,39,34,37,36,40,32,39,39,38,34,34,38,35,31,33,
   32,28,38,37,34,36,35,37,34,37,34,40,39,38,34,28,30,29,32,
   39,36,33,36,31)
 
 > n=length(x)  # antal observationer
 > phat=sum(x)/(50*n)  # skøn over p
 > endePkt=24+c(0:10)*2-0.5 # intervalendepunkter i histogram
 > antal=hist(x,breaks=endePkt)$counts  # figur med antalshistogram

 # beregne forventede fra binomialfordeling
 > p0=pbinom(endePkt,50,phat) # sandsynlighed til venstre for endepunkter
 > p=c(p0[2],p0[3:10]-p0[2:9],1-p0[10])  # intervalsandsynligheder
 # første interval fra 0 til og med 25, sidste fra 42 til 50

 > ex=n*p  # forventede
 > cbind(antal,round(ex,2)) # round afrunder tallene
      antal      
  [1,]     1  0.29
  [2,]     0  1.15
  [3,]     6  3.97
  [4,]    10 10.03
  [5,]    16 18.32
  [6,]    22 23.87
  [7,]    22 21.77
  [8,]    15 13.52
  [9,]     7  5.49
 [10,]     1  1.59
  
 # slår intervaller sammen for at få forventede >= 5
 > antal1=c(antal[1]+antal[2]+antal[3],antal[4:8],antal[9]+antal[10])
 > ex1=c(ex[1]+ex[2]+ex[3],ex[4:8],ex[9]+ex[10])
 > cbind(antal1,round(ex1,2))
     antal1      
 [1,]      7  5.41
 [2,]     10 10.03
 [3,]     16 18.32
 [4,]     22 23.87
 [5,]     22 21.77
 [6,]     15 13.52
 [7,]      8  7.08

 > gTest=2*sum(antal1*log(antal1/ex1));
 > df=length(antal1)-1-1;
 > pval=1-pchisq(gTest,df);

 > c(gTest,df,pval)
  [1] 1.1580229 5.0000000 0.9488405

R.6.5 Test

I dette afsnit nævnes nogle af de funktioner i R, der bruges til klassiske statistiske tests.
Hvis er en vektor med dataværdier, kan man lave et -test for, at middelværdien har en bestemt værdi mu0 med t.test. Dette er gennemgået i afsnit 4.4. Den mest simple version er som følger:
t.test(x,mu=mu0)
Hvis mu=mu0 udelades, laves et test for, om middelværdien er nul. Hvis output placeres i testUD kan man adressere de forskellige dele af output ved at skrive testUDnavn. De vigtigste muligheder er:
Konfidensintervallet er for den ukendte middelværdi, og størrelsen af konfidensintervallet bestemmes af et niveau, der kan vælges ved at tilføje conf.level=0.95 i kaldet til t.test.
Funktionen t.test laver et såkaldt tosidet test, det vil sige, at både store positive og store negative værdier er kritiske. Hvis man ønsker et test, hvor det kun er store positive værdier, der er kritiske, skal man tilføje alternative="greater" i kaldet til t.test.
Ovenfor blev -testet for en observationsrække omtalt. Lad os nu betragte -testet for samme middelværdi i to observationsrækker. Dette svarer til afsnit 4.13. Antag, at vektoren indeholder dataværdierne for den ene observationsrække og dataværdierne for den anden observationsrække. Den relevante kommando er
t.test(x,y,var.equal=TRUE)
som laver -testet under antagelse om, at varianserne i de to grupper er ens. Hvis varianserne ikke er ens, skal man ændre TRUE til FALSE. Outputtet fra funktionen indeholder de samme elementer som ovenfor. Konfidensintervallet er i dette tilfælde for forskel i middelværdi mellem de to grupper
I tilfældet med to grupper af observationer kan man lave et test for, at de to varianser er ens ved
var.test(x,y)
Igen vil outputtet have de komponenter, der er nævnt ovenfor. Konfidensintervallet er for forholdet mellem de to varianser.
Output fra en funktion som t.test kaldes i R for en liste. Man kan se, hvilke elementer listen indeholder ved at skrive
names(navn)
hvor navn er navnet på den struktur output er placeret i.

R.6.6 Regression

Den lineære regressionsmodel fra afsnit 5.1 analyseres i R ved hjælp af kommandoen lm(xt). I dette udtryk er responsvariabel, og er den forklarende variabel. Udtrykket "xt" kaldes modelformlen. Den følgende kode viser dette med Hubbles data omtalt i afsnit 5.6. De to figurer der produceres, kan ses i den sidste figur i afsnit R.2 øverste højre hjørne og nederste delfigur.
En meget brugbar efterbehandling af resultatet fra lm er funktionen summary. Denne giver blandt andet skønnet over spredningen på data, og den giver en tabel med parameterestimater, standard error for disse og et -test for, om parameteren kan antages at være nul. En anden efterbehandling er ordren confint(), der giver konfidensintervaller for parametrene i middelværdimodellen.

 > a=c(0.032,0.034,0.214,0.263,0.275,0.275,0.450,0.500,
    0.500,0.630,0.800,0.900,0.900,0.900,0.900,1.000,
    1.100,1.100,1.400,1.700,2.000,2.000,2.000,2.000)
 > h=c(170,290,-130,-70,-185,-220,200,290,270,200,300,
    -30,650,150,500,920,450,500,500,960,500,850,800,1090)
 > plot(a,h,xlab="Afstand",ylab="Hastighed", main="Regression")

 > lmUD=lm(h~a)  # model analyseres og resultat placeres i lmUD

 > lmUD$coefficients  # parameterestimater
  (Intercept)           a 
    -40.78365   454.15844 

 > confint(lmUD)  # konfidensintervaller
                  2.5 %   97.5 %
  (Intercept) -213.8253 132.2580
  a            298.1262 610.1906 

 > abline(lmUD)  # linje indtegnes

 > sumUD=summary(lmUD)  # uddrager information om den fittede model

 > sumUD
  Call:
  lm(formula = h ~ a)

  Residuals:
      Min      1Q  Median      3Q     Max 
  -397.96 -158.10  -13.16  148.09  506.63 

  Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
  (Intercept)   -40.78      83.44  -0.489     0.63    
  a             454.16      75.24   6.036 4.48e-06 ***
  ---
  Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

  Residual standard error: 232.9 on 22 degrees of freedom
  Multiple R-squared:  0.6235,	Adjusted R-squared:  0.6064 
  F-statistic: 36.44 on 1 and 22 DF,  p-value: 4.477e-06

 > df=sumUD$df[2]
 > s=sumUD$sigma
 > ssd=df*s^2
 > c(df,ssd,s,s^2)
  [1]      22.0000 1193442.3663     232.9107   54247.3803

 > plot(a,sumUD$residuals,xlab="Afstand",ylab="Residualer")
 > abline(0,0)

Funktionen lm kan også bruges til den generelle lineære model beskrevet i kapitel 6 og kapitel 7. Følgende eksempel ser på data i afsnit 6.6. For at beskrive modellen skal nogle af variablene defineres som faktorer.



 > areal=c(264,200,225,268,215,241,232,256,229,288,253,288,230,
   235,188,195,205,212,214,182,215,272,163,230,255,202,
   314,320,310,340,299,268,345,271,285,309,337,282,273,
   283,312,291,259,216,201,267,326,241,291,269,282,257)
 > stress=factor(rep(c("Uden","Med","Uden","Med"),c(13,13,13,13)))
 > lys=factor(rep(c("Lav","Hoej"),c(26,26)))

 > lmUD=lm(areal~lys*stress)  # tosidet variansanalyse
 
 > summary(lmUD)  # information om fittet til data

 Call:
 lm(formula = areal ~ lys * stress)

 Residuals:
     Min      1Q  Median      3Q     Max 
 -67.846 -19.385  -0.385  19.538  59.077 

 Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
 (Intercept)        268.846      8.299  32.395  < 2e-16 ***
 lysLav             -55.923     11.736  -4.765 1.79e-05 ***
 stressUden          35.231     11.736   3.002  0.00425 ** 
 lysLav:stressUden   -2.846     16.598  -0.171  0.86457    
 ---
 Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

 Residual standard error: 29.92 on 48 degrees of freedom
 Multiple R-squared:  0.5729,	Adjusted R-squared:  0.5462 
 F-statistic: 21.46 on 3 and 48 DF,  p-value: 5.867e-09
 
 # Lave F-test for additiv struktur
 > anova(lm(areal~lys+stress),lm(areal~lys*stress))

 Analysis of Variance Table

 Model 1: areal ~ lys + stress
 Model 2: areal ~ lys * stress
   Res.Df   RSS Df Sum of Sq      F Pr(>F)
 1     49 43003                           
 2     48 42976  1    26.327 0.0294 0.8646

Foregående