Hur stor blir felmarginalen vid en viss urvalsstorlek?

Hur stor blir felmarginalen vid en viss urvalsstorlek? Denna enkla fråga tänkte jag besvara genom att måla upp en graf.

Felmarginaler är ett roligt ämne. I stället för att traggla med formler eller tabeller försöker jag göra så mycket som möjligt visuellt, i synnerhet när jag ska visa för andra vad det egentligen är som händer. Det brukar vara lättare att förstå om man kan se resultaten av det man gör, snarare än att försöka bygga en abstrakt modell i huvudet av vad som händer (vilket förvisso inte ska underskattas det heller).

Jag försöker också dra nytta av mina programmeringskunskaper och lära mig R bättre. Så varför inte göra ett litet skript som gör allt det manuella arbetet till något som kan återanvändas och presenteras grafiskt?

Här kommer därför en liten bild som visar felmarginalerna vid olika urvalsstorlekar. Det gör det förhoppningsvis lite lättare att förstå varför man använder ungefär 1 000 personer i olika former av opinionsundersökningar, snarare än 2 000 eller 3 000. Vinsten av att använda fler personer än tusen är ofta inte särskilt stor.

Jag har också medvetet valt ett alternativ med 50 % eftersom felmarginalen blir som störst då. Det beror på att det i formeln finns en kvadratisk funktion (p * (1 - p)). Ju närmare mitten i intervallet 0 och 100 %, desto större blir helt enkelt osäkerheten.

Hur urvalsstorleken påverkar felmarginalen

Som du ser i koden nedan så förutsätter jag 95 % konfidensintervall om man inte anger något annat. Man måste dock skriva z-värdet, så därför bifogar jag en liten lathund över dessa. Och som vanligt gäller felmarginalerna inte för självselektion och liknande urval som inte har plockats slumpmässigt från en population.

# Lathund:
# 50 % CI = 0.674 z-score
# 80 % CI = 1.282 z-score
# 90 % CI = 1.645 z-score
# 95 % CI = 1.960 z-score
# 98 % CI = 2.326 z-score
# 99 % CI = 2.576 z-score

# Funktion för att räkna ut felmarginal
marginoferror <- function (p, n, z=1.96, population=9600000) {
    if(p>=1) {
      stop("p måste vara proportion under 1, exempelvis 0.60 för 60 %.")
    }
    # Skippa korrektionsfaktorn då den inte ger speciellt mycket
    return (z * sqrt((p * (1 - p)) / n) * 100) # * (1 - (n / population))))
}

# Funktion för att plotta felmarginal vid olika proportioner
plotta <- function (proportion, z=1.96) {
  # Bygg vektor med N och felmarginal
  l <- c(n=0, felmarginal=marginoferror(proportion, 0))
  for (n in 1:2000) {
   l <- rbind(l, c(n=n, felmarginal=marginoferror(proportion, n, z=z)))
  }
  
  # Plotta
  plot(l, type="n",cex.main=1.35, main=paste("Felmarginal vid olika urvalsstorlekar\nnär ett alternativ får ", proportion * 100, "% av rösterna", sep=""),
      xlab="Urvalsstorlek (N)", cex.lab=1.35, ylab="Felmarginal (%)")
  grid()
  points(l, col="red")
  axis(side=1, at=seq(0, 2000, by=500))
  axis(side=2, at=seq(0, 100, by=10))
}

plotta(0.50) # 50 %
plotta(0.50, z=2.576) # 50 % på 99 % CI