Bakgrund
I boken A History of
Mathematical Statistics From 1750 to
1930 finns det på sidan 54 en intressant bild på en
sannolikhetsfördelning, se nedan. Fördelningen gäller spridningen av
medelvärdet av tre mätvärden, likformigt fördelade på intervallet [0,
a].
Det är ganska uppenbart att det är något fel på kurvan.
Den består av tre andragradskurvor - en från 0 till a/3, en från
a/3 till 2a/3 och till sist en från 2a/3 till
a på X-axeln. På sidan 53 finns det matematiska uttryck som ger
tre korrekta kurvor, R-koder finns nedan, men det är lite otydligt
varför diagrammet har ritats som på bilden.
Nedan anges tre olika illustrationer:
1. Laplaces uttryck och Bates fördelning
2. En simulering av Bates fördelning
3. Normalfördelningen som tre andragradsfunktioner
1. Laplaces uttryck och Bates fördelning
Laplaces andragradsuttryck finns på sidan 53 i boken och är
programmerade i kodavsnittet nedan. ‘Bates distribution’ (se t.ex.
Wikipedia) handlar om medelvärdet av n värden från en likformig
fördelning på intervallet [0, a].
För beräkning av Bates
fördelning har jag skapat en funktion (Batesfxn) som tar emot ett antal
parametrar, se kodningen.
# Se Bates Distribution i Wikipedia
library(ggplot2)
Batesfxn <- function(n, x, a, b) {
zsum <- c()
for(k in c(0:n)) {
x1 <- (x - a)/(b - a)
z1 <- 1/(b-a) * n/(2*factorial(n-1)) * (-1)^k * choose(n, k) * (n*x1 - k)^(n-1) * sign(n*x1 - k)
zsum <- c(zsum, z1)
}
return(sum(zsum))
}
n <- 3 # Antal termer. OBS i denna övning är n bara tre (p.gr.a. Laplaces uttryck)
a <- 0 # Undre och övre interval på den likformiga fördelningen.
b <- 1
xvarde <- seq(a, b, 0.01) # Skapar en lista med x-värden.
yvarde <- c() # En kolumn som tar emot y-värdena (dvs f(x))
for (i in c(1:length(xvarde))) {
yvarde <- c(yvarde, Batesfxn(n, xvarde[i], a, b))
}
# 'xvarde' och 'yvarde' är den korrekta sannolikhetsfördelningen, ritas nedan.
# Skapats enligt 'Bates distribution'
# --------------------------------------------------------------------
# Nedan skapas tre kurvor enligt uttrycken på sidan 53 i boken.
a <- 1
n <- 3
x1 <- seq(0, a/3, 0.01)
r <- 1
z <- x1 - (r-1)*a/n
y1 <- 27/(2*a^3)*(z)^2 # Vänstra (blå) kurvsegmentet.
x2 <- seq(a/3, 2*a/3, 0.01)
r <- 2
z <- x2 - (r-1)*a/n
y2 <- 3/(2*a^3)*(a^2 + 6*a*(z) - 18*(z)^2) # Röda kurvsegmentet.
x3 <- seq(2*a/3, a, 0.01)
r <- 3
z <- x3 - (r-1)*a/n
y3 <- 3/(2*a^3)*(a^2 - 6*a*(z) + 9*z^2) # Högra (blå) kurvsegmentet.
fordelning <- ggplot() +
geom_line(aes(x=xvarde, y=yvarde), linewidth=3, linetype=2, color=("green")) + # Enligt Bates Distribution.
geom_line(aes(x=x1, y=y1), linewidth=1.5, color=("blue")) + # Vänstra delen enl boken.
geom_line(aes(x=x2, y=y2), linewidth=1.5, color=("red")) + # Mittendel enl boken.
geom_line(aes(x=x3, y=y3), linewidth=1.5, color=("blue")) + # Högra delen enl boken.
xlab("x") + ylab("f(x)")
fordelning
Den gröna streckade linjen är korrekt sannolikhetsfördelning beräknad enligt Bates fördelning. De två blå och det röda avsnitten är andragradsfunktionerna enligt Laplaces uttryck enigt sidan 53 i boken. Alla avsnitten sammanfaller bra med den korrekta funktionen.
2. En simulering av Bates fördelning
Nedan simuleras tre kolumner med värden från en likformig fördelning [0, 1] där medelvärdet beräknas radvis. Grafen innehåller ett histogram samt en kurva (som beräknats ovan):
antal <- 5000
a <- 0
b <- 1
data1 <- runif(antal, a, b)
data2 <- runif(antal, a, b)
data3 <- runif(antal, a, b)
dataSim<- data.frame(cbind(data1, data2, data3))
dataSim$medelv <- rowMeans(dataSim)
fordelnkurva <- data.frame(xvarde, yvarde)
histogram <- ggplot(dataSim, aes(medelv)) + geom_histogram(bins=15, color='yellow', alpha = 0.5,
aes(y = after_stat(density)), position = 'identity') + labs(x = "Simulerade värden", y = "") +
geom_line(data = fordelnkurva, aes(x = xvarde, y = yvarde), linewidth = 1.5, col = "green")
histogram
Kommentar till grafen. Histogrammet är som förväntat centrerat runt medelvärdet (0.5). Ju fler termer som ingår i medelvärdet desto mer normalfördelningslik blir fördelningen, dock med undantaget att svansarna inte går mot oändligheten.
3. Normalfördelningen som tre andragradsfunktioner
Det verkar en smula onödigt att försöka anppassa tre andragradskurvor
till normalfördelningens sannolikhetsfunktion. Denna är ju välkänd och
med många datorkommandon till hands.
X-axeln delades upp i tre
sektioner och för varje sektion beräknas f(x). Därefter
används glm-kommandot för att anpassa en andragradskurva till värdena.
De erhållna parametervärdena utnyttjas sedan för att rita kurvan:
library(ggplot2)
xaxel1 <- seq(-3, -1, 0.2) # Left part of X-axis.
yaxel1 <- dnorm(xaxel1) # Calculating f(x).
ana1 <- glm(yaxel1 ~ xaxel1 + I(xaxel1^2)) # Performing the analysis.
b01 <- ana1$coef[1] # Extracts the three coefficients.
b11 <- ana1$coef[2]
b21 <- ana1$coef[3]
xaxel2 <- seq(-1, 1, 0.2) # Middle part of the X-axis.
yaxel2 <- dnorm(xaxel2) # Calculating f(x).
ana2 <- glm(yaxel2 ~ xaxel2 + I(xaxel2^2)) # Performing the analysis.
b02 <- ana2$coef[1] # Extracts the three coefficients.
b12 <- ana2$coef[2]
b22 <- ana2$coef[3]
xaxel3 <- seq(1, 3, 0.2) # Right part of the X-axis.
yaxel3 <- dnorm(xaxel3) # Calculating f(x).
ana3 <- glm(yaxel3 ~ xaxel3 + I(xaxel3^2)) # Performing the analysis.
b03 <- ana3$coef[1] # Extracts the three coefficients.
b13 <- ana3$coef[2]
b23 <- ana3$coef[3]
del1 <- function(x) {b01 + b11*x + b21*x*x} # Creating functions of the three parts.
del2 <- function(x) {b02 + b12*x + b22*x*x}
del3 <- function(x) {b03 + b13*x + b23*x*x}
del4 <- function(x) {dnorm(x)} # f(x) according to 'R'-code.
approxNormal <- ggplot() +
geom_function(fun=del1, colour='blue', linewidth=1.5, xlim=c(-3, -1)) + # Left 2-degree
geom_function(fun=del2, colour='red', linewidth=1.5, xlim=c(-1, 1)) + # Middle 2-degree
geom_function(fun=del3, colour='blue', linewidth=1.5, xlim=c( 1, 3)) + # Right 2-degree
geom_function(fun=del4, colour='green', linewidth=1.5, linetype=2, xlim=c(-3, 3)) + # normal curve
xlab("x") + ylab("f(x)")
approxNormal
Kommentar till grafen. Grön linje är den korrekta kurvan men med ögonmått passar andragradskurvorna bra. Alla andragradskurvor är ju parabler och vid -3 and +3 på X-axeln syns kurvorna vända uppåt.
Avslutningsvis. Ovanstående text är föranledd av en bild i boken som omnämnts och innehåller i sak inget nytt.
(Analyserna har gjorts med datorprogrammet ‘R’ och med det grafiska gränssnittet ‘R-studio’ och bägge är gratis tillgängliga på nätet. Se https://www.indstat.se och knappen [Statistikprogram - R] för installation.)
(Se https://www.indstat.se för många andra simuleringsövningar.)