Rud Faden

Histogram Misbrug

Da jeg læste økonomi, brugte vi hele tiden histogrammer til at vurdere om fejlleddet på en regression var normalfordelt. Måske fordi SAS, som var standard programmet dengang, spyttede dem ud automatisk. I dag bliver histogrammer stadigt hyppigt brugt til at vurdere fordelingen af observationer. 

Men fredag aften sad jeg, som man jo så ofte gør, og surfede lidt rundt på Cross Validated. Her blev jeg oplyst om histogrammers løgnagtige natur. 

Histogrammer er meget følsomme over for søjlebredden og endepunkter. Faktisk kan valget af søjlebredden fuldstændigt ændre formen på histogrammet. 

Se f.eks. på følgende R data

<Annie <- c(3.15,5.46,3.28,4.2,1.98,2.28,3.12,4.1,3.42,3.91,2.06,5.53,5.19,2.39,1.88,3.43,5.51,2.54,3.64,4.33,4.85,5.56,1.89,4.84,5.74,3.22,5.52,1.84,4.31,2.01,4.01,5.31,2.56,5.11,2.58,4.43,4.96,1.9,5.6,1.92)
Brian <- c(2.9, 5.21, 3.03, 3.95, 1.73, 2.03, 2.87, 3.85, 3.17, 3.66,1.81, 5.28, 4.94, 2.14, 1.63, 3.18, 5.26, 2.29, 3.39, 4.08, 4.6,5.31, 1.64, 4.59, 5.49, 2.97, 5.27, 1.59, 4.06, 1.76, 3.76, 5.06,2.31, 4.86, 2.33, 4.18, 4.71, 1.65, 5.35, 1.67)
Chris <- c(2.65, 4.96, 2.78, 3.7, 1.48, 1.78, 2.62, 3.6, 2.92, 3.41, 1.56,5.03, 4.69, 1.89, 1.38, 2.93, 5.01, 2.04, 3.14, 3.83, 4.35, 5.06,1.39, 4.34, 5.24, 2.72, 5.02, 1.34, 3.81, 1.51, 3.51, 4.81, 2.06,4.61, 2.08, 3.93, 4.46, 1.4, 5.1, 1.42)
Zoe <- c(2.4, 4.71, 2.53, 3.45, 1.23, 1.53, 2.37, 3.35, 2.67, 3.16,1.31, 4.78, 4.44, 1.64, 1.13, 2.68, 4.76, 1.79, 2.89, 3.58, 4.,4.81, 1.14, 4.09, 4.99, 2.47, 4.77, 1.09, 3.56, 1.26, 3.26, 4.56,1.81, 4.36, 1.83, 3.68, 4.21, 1.15, 4.85, 1.17

og følgende histogrammer


Det er klart at disse må komme fra forskellige data med forskellig fordeling, ikke? Men hvis vi trækker de første datasæt for Annie, fra de andre, får vi

head(matrix(x-Annie,nrow=40)))

AnniBrianChrisZoe
0-0.25-0.5-0.75
0-0.25
-0.5
-0.75
0-0.25
-0.5
-0.75

Data er altså det samme bare flyttet til venstre med 0.25.

Hvis vi varierer søjlebredden, kan vi få andre ting som det her til at ske. 

x <- c(1.03, 1.24, 1.47, 1.52, 1.92, 1.93, 1.94, 1.95, 1.96, 1.97, 1.98,1.99, 2.72, 2.75, 2.78, 2.81, 2.84, 2.87, 2.9, 2.93, 2.96, 2.99, 3.6, 3.64, 3.66, 3.72, 3.77, 3.88, 3.91, 4.14, 4.54, 4.77, 4.81, 5.62)<br>par(mfrow=c(2,1))hist(x,breaks=seq(0.3,6.7,by=0.8),xlim=c(0,6.7),col="green3",freq=FALSE)hist(x,breaks=0:8,col="aquamarine",freq=FALSE)


De eksempler jeg har vidst her (og som er tyv stjålet fra denne post, er selvfølgeligt skabt for at illustrere en pointe. Men pointen skulle også gerne være klar. Histogrammer giver ikke nødvendigvis noget særligt godt billed af data. Du bør i hvert fald ændre søjlebredden, for at se om det påvirker formen på histogrammet.  

Et godt alternativ til histogrammet er density plots.  Laver vi f.eks. et density plot på det første eksempel, så får vi dette plot, hvor vi klart ser at det er samme data der er brugt. 

opar<-par()<br>par(mfrow=c(2,2))<br>plot(density(Annie) , main="Annie",xlab="V1",col="lightblue")<br>plot(density(Brian) , main="Brian",xlab="V2",col="lightblue")<br>plot(density(Chris) , main="Chris",xlab="V3",col="lightblue")<br>plot(density(Zoe &nbsp;) , main="Zoe",xlab="V4",col="lightblue")<br>par(opar)


Statistikeren George E. P. Box  sagde engang

Essentially, all models are wrong, but some are useful 

Måske kan man sige det samme om statistiske plots. Men måske formuleret endnu stærkere fordi at plots som regel giver os en følelse af at, vi kender data, og at det vi ser er sandt. Den forførende følelse af at se nogen "åbenlyst" gør dem farlige og nemme at misbruge. Om det så er bevidst eller ej. 

7 kommentarer


Sebastian  Barfort

Sebastian Barfort @ d. 08. april 2015 #1

HeJ Rud,

jeg er ikke enig her. Jeg synes man kan omformulere dit indlæg til "Brug ordentlig software". De histogrammer du viser i starten er ikke standard hvis du bruger R's indbyggede histogram funktion. Men selv denne bør du ikke bruge.
Mere moderne plot biblioteker som ggplot2 sætter som default binwidth til range/30, hvilket giver følgende plot

http://rpubs.com/Sebastianbarfort/71957

Det giver et anderledes - og mere retvisende - billede af data.

Det er ikke klart at density plots altid er bedre. Hvis dit data har meget diskret karakter er histogrammer fine, men du skal selvfølgelig være obs på at tjekke om der er fuppet med binwidth. Ligesom man i øvrigt skal være obs på om density plots overfitter i områder med meget lidt data.

Bh
Sebastian


Rud Faden

Rud Faden @ d. 08. april 2015 #2

Hej Sebastian.

Tak for din kommentar. Som skrevet i artiklen er disse eksempler selvfølgeligt konstrueret. Min pointe var ikke at R eller andre software biblioteker generere dårlige histogrammer. Derimod at man (bevidst eller ej) kan vælge en bin-width der ændre histogrammets form.

Alle plots har sine svagheder, men histogrammer er særligt følsomme over for ændring i bin-width og endepunkter.


Sebastian  Barfort

Sebastian Barfort @ d. 16. april 2015 #3

Hej Rud,

jeg synes det er en god pointe at man skal være meget opmærksom på binwidth når man bruger histogrammer.
Her er et eksempel hvor vi lærer mere af klog brug af binwidth end ved eksempelvis et density plot.

http://rpubs.com/Sebastianbarfort/73052


Rud Faden

Rud Faden @ d. 16. april 2015 #4

Hej Sebastian.

Tak for dit svar. Mit indlæg handlede nu også mest om at se på fordelingen af data. Hvis du laver søjlerene meget små, så mister man lidt overblikket til fordel for detaljen.

Man kan nu godt gøre noget tilsvarende ved at bruge Density plots. Man skal bare justere kernel vægtene.

Men hvor man godt kan få et misvisende histogram i overstående tilfælde ved at variere søjlebredden, så kan man ikke gøre det med et Density plot. Det er i hvertfald ikke lykkedes mig. Men hvis der er nogen der kan give et eksempel, så ville det da være fedt.

Jeg givet et lille eksempel her http://rpubs.com/rudfaden/73057

Men som du forslå, så kan man jo altid lave begge dele. Så er man da rimeligt sikker.


Sebastian  Barfort

Sebastian Barfort @ d. 16. april 2015 #5

I ovenstående tilfælde er dit data nærmest kontinuært, så der er density nok ok. Men det har sine egne generelle problemer: sandsynlighedsmasse på den negative del af aksen selvom dit data kun kan tage positive værdier, positiv sandsynlighedsmasse for værdier dit data ikke kan antage når dit data er diskret, etc.

Der er nogle ok kommentarer her:
http://andrewgelman.com/2009/11/25/whats_wrong_wit/

Det vigtigste er nok bare at man tænker sig om uanset hvad man gør. Men at histogrammer skulle være særlig "løgnagtige" som du skriver ovenfor synes jeg stadig er en stramning.


Rud Faden

Rud Faden @ d. 16. april 2015 #6

Det kan godt være jeg har været lidt løs med tillægsordende :)


Sebastian  Barfort

Sebastian Barfort @ d. 16. april 2015 #7

:)


Tak for din kommentar!
Skriv venligst en kommentar der er længere end 5 tegn

Skriv en kommentar

Log ind for at kommentere - eller opret en bruger

Rud Faden