Beräkna optimalt antal soptunnor i ett histogram

Jag är intresserad av att hitta en så optimal metod som möjligt för att bestämma hur många soptunnor jag ska använda i en histogram. Mina data bör sträcka sig från högst 30 till 350 objekt, och i synnerhet försöker jag tillämpa tröskelvärden (som Otsus metod) där ”bra” objekt, som jag borde ha färre av och borde spridas mer, är separerade från ”dåliga” objekt, som borde ha ett tätare värde. Ett konkret värde skulle ha en poäng på 1-10 för varje objekt. Jag hade 5-10 objekt med poäng 6-10 och 20-25 objekt med poäng 1-4. Jag skulle vilja hitta ett histogram-bindningsmönster som i allmänhet tillåter att något liknande Otsus metod trösklar bort objekt med låg poäng. Men vid implementeringen av Otsus jag har sett var pappersstorleken 256 och ofta har jag många färre datapunkter än 256, vilket för mig tyder på att 256 inte är ett bra binummer. Med så få data, vilka tillvägagångssätt ska jag ta för att beräkna antalet lagerplatser som ska användas?

Kommentarer

  • Jag tror att Stures ’ regel kan användas för n < 200; där n är antalet observationer

Svar

Freedman-Diaconis -regeln är mycket robust och fungerar bra i praktiken. Fackbredden är inställd på $ h = 2 \ times \ text {IQR} \ times n ^ {- 1/3} $ . Så antalet lagerplatser är $ (\ max- \ min) / h $ , där $ n $ är antalet observationer, max är maximivärdet och min är minimivärdet.

I bas R kan du använda:

 hist(x, breaks="FD")  

För andra plottbibliotek utan detta alternativ (t.ex. ggplot2) kan du beräkna binbredd som:

 bw <- 2 * IQR(x) / length(x)^(1/3) ### for example ##### ggplot() + geom_histogram(aes(x), binwidth = bw)  

Kommentarer

  • @nico. Standardvärdet i R är break = ” Sturar ” vilket inte alltid ger bra resultat.
  • Hur gör man beräkna IQR?
  • @KurtMueller IQR betyder interkvartilintervall. Leta efter första kvartilen och den tredje kvartilen och skillnaden är IQR. IQR kommer redan med R så att du kan använda den.
  • Om jag inte tar fel bör svaret läsa num_bins <- diff(range(x)) / (2 * IQR(x) / length(x)^(1/3))
  • nclass.FD fanns inte för nio år sedan.

Svar

Om du använder för få papperskorgar, visar histogrammet verkligen inte data mycket bra. Om du har för många papperskorgar får du ett trasigt kamutseende, vilket inte heller ger en känsla av fördelningen.

En lösningen är att skapa ett diagram som visar varje värde. Antingen ett punktdiagram eller en kumulativ frekvensfördelning som inte kräver några lagerplatser.

Om du vill skapa en frekvensfördelning med lika placerade lagerplatser måste du bestämma hur många lagerplatser (eller bredden av varje). Beslutet beror helt klart på antalet värden. Om du har många värden kommer din graf att se bättre ut och vara mer informativ om du har många lager. Detta wikipedia-sidan listar flera metoder för att bestämma pappersbredd utifrån antalet observationer. Den enklaste metoden är att ställa in antalet lagerplatser lika med kvadratroten av antalet värden du binder.

Den här sidan från Hideaki Shimazaki förklarar en alternativ metod. Det är lite mer komplicerat att beräkna, men verkar göra ett bra jobb. Den övre delen av sidan är en Java-app. Bläddra förbi den för att se teorin och förklaringen och bläddra sedan för att hitta länkar till papper som förklarar metoden.

Kommentarer

Svar

Kanske papperet ” Variationer på histogrammet ”av Denby och Mallows kommer att vara av intresse:

Denna nya skärm som vi kallar” dhist ”(för diagonalt -cut histogram) bevarar de önskvärda funktionerna i både hist-bredd med samma bredd och hist med samma område. Det kommer att visa höga smala soptunnor som ea-hist när det finns spikar i data och kommer att visa isolerade avvikare precis som det vanliga histogrammet. den koden i R är tillgänglig på begäran.

Svar

Såg du Shimazaki-Shinomoto -metoden?

Även om det verkar vara beräkningsbart dyrt kan det ge dig bra resultat. Det är värt att prova om beräkningstiden inte är ditt problem.Det finns några implementeringar av denna metod i java, MATLAB, etc i följande länk, som går tillräckligt snabbt: webbgränssnitt

Kommentarer

  • Här är en implementering: gist.github.com/salotz/0158a99a75078b47538452111ec0faa2 . Och ja det är dyrare eftersom du väljer ett intervall för antalet soptunnor och du måste skapa ett histogram för varje och sedan beräkna en kostnad och sedan välja den mest minimala kostnaden.

Svar

Jag är inte säker på att detta räknas som strikt god praxis, men jag brukar producera mer än ett histogram med olika fackbredder och välja det histogram som histogramet ska användning baserat på vilket histogram som passar den tolkning jag försöker kommunicera bäst. Medan detta introducerar viss subjektivitet i valet av histogram, motiverar jag det med utgångspunkt från att jag har haft mycket mer tid att förstå uppgifterna än den person jag ger histogrammet till, så jag måste ge dem ett mycket kortfattat meddelande.

Jag är också ett stort fan av att presentera histogram med samma antal punkter i varje fack snarare än samma fackbredd. Jag tycker vanligtvis att dessa representerar data mycket bättre än den konstanta pappersbredden även om de är svårare att producera.

Kommentarer

  • ledsen, jag borde ha nämnt att jag behöver göra detta på ett automatiserat sätt. alternativet att ” gör det flera gånger tills jag hittar den som bäst passar mitt syfte ” vann ’ fungerar inte för mig. måste göras beräkningsmässigt …
  • Jag håller med – tanken att det finns en ” optimal ” bredd är ett enormt förenklat antagande.

Svar

Om jag behöver bestämma antalet lagerplatser programmatiskt brukar jag börja med ett histogram som har mycket fler lagerplatser än vad som behövs. När histogrammet är fyllt kombinerar jag sedan soptunnor tills jag har tillräckligt med poster per fack för den metod jag använder, t.ex. om jag vill modellera Poisson-osäkerheter i ett räkneexperiment med osäkerheter från en normalfördelning tills jag har mer än ungefär tio poster.

Svar

Se svaret som ett komplement till Mr. Rob Hyndmans svar .

För att skapa histogramdiagram med exakt samma intervall eller ”binwidths” med Freedman – Diaconis-regel antingen med grundläggande R- eller ggplot2 -paket, vi kan använda ett av värdena för hist() -funktionen, nämligen breaks. Antag att vi vill skapa ett histogram av qsec från mtcars data med hjälp av Freedman – Diaconis-regeln. I grundläggande R använder vi

x <- mtcars$qsec hist(x, breaks = "FD") 

Under tiden, i ggplot2 -paket som vi använder

h <- hist(x, breaks = "FD", plot = FALSE) qplot(x, geom = "histogram", breaks = h$breaks, fill = I("red"), col = I("white")) 

Eller alternativt

ggplot(mtcars, aes(x)) + geom_histogram(breaks = h$breaks, col = "white") 

Alla genererar histogramdiagram med exakt samma intervall och antal lagerplatser som avsett.

Svar

I har 600 observationer för Au g / t. Fackstorlek 1 ger mig detta: ange bildbeskrivning här

Automatiskt val (utelämna fackintervallet) ger detta: ange bildbeskrivning här

Data ser O ”K ut i första och andra diagrammet, som om det finns inga problem med dataintegritet. Endast pappersstorlek 0,1 (g / t) svarar på frågan: mätningarna var både felaktiga och felaktiga ange bildbeskrivning här

Mitt omdöme: 1. Det finns ingen mätteknik på jorden för att visa upp det verkliga värdet av naturfenomen. Alla mätningar är ungefärliga, vissa ligger nära det verkliga värdet. Det beror på provtagningsdesign, kalibrering, mänskliga kvalifikationer etc. 2. Det är därför som distributionen är sned snarare än symmetrisk. 3. Ändå bör distributionens form likna en ”klockliknande” sektion, åtminstone ungefär. En klocka i taget (såvida det inte finns flera geologiska miljöer). 4. Frekvensfördelning med behållarstorleksmanipulation kan hjälpa till att avslöja mönster på hur exakt och exakt om mätningarna hade gjorts. Så att man behöver en experimentell plockning av pappersstorleken snarare än en regel som klipps på sten.

Kommentarer

  • Detta är mer en kommentar än en svara om du inte stavar moral. Jag ’ Jag säger att moral är detta: Alla regler är tumregler, vissa har mer statistisk grund än andra, men de flesta regler kanske inte gör vad du vill om distributioner har mycket hög snedhet eller kurtos. Så använd också din bedömning.
  • Du har lagt till kommentarer, men det är inte klart att några bidrar till nya detaljer till tråden. 1.är bra för mig men inte problemet här. 2. följer inte ’ från 1. eftersom vissa fördelningar är nästan symmetriska. 3. är tveksamt: det finns många situationer där andra former än klockor förväntas. 4. är också tvivelaktigt eftersom kvaliteten på de ursprungliga mätningarna ofta inte framgår av något histogram, men ofta bäst undersöks med hänsyn till den mycket fina strukturen i en distribution.
  • 2. Nästan symmetrisk är inte symmetrisk. Du kan inte vara nästan gravid: antingen gravid eller inte.
  • Visst, men exakt symmetri i data är så mycket sällsynt att om jag hade sagt ” symmetrisk ” någon kan rimligen motsätta sig det också. Det ’ är mycket lätt att vara nästan symmetrisk; det är därför och hur vi har mått på snedhet.
  • Noteras, men din kommentar var generell och saknade det sammanhang du nu ger. I sin tur sa jag ” tvivelaktig ” inte ” fel ”. Min viktigaste kommentar är att ditt svar inte ’ verkligen lägger till mycket i tråden om hur man väljer pappersstorlek eller motsvarande antal lagerplatser. Att ha ett annat exempel där det ’ är svårt är en snurr på frågan, inte riktigt ett svar.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *