Dopasowanie danych do dystrybucji?

Nie jestem statystykiem (bardziej badawczym programistą), ale ostatnio dużo słyszałem oscipy iR . Tak więc z ciekawości chciałem zadać to pytanie (choć może to zabrzmieć głupio dla ekspertów tutaj), ponieważ nie jestem pewien postępów w tej dziedzinie i chcę wiedzieć, jak ludzie bez tła statystyk dźwięku podejść do tych problemów.

Biorąc pod uwagę zbiór liczb rzeczywistych obserwowanych z eksperymentu, powiedzmy, że należą one do jednego z wiele dystrybucji tam (jak Weibull, Erlang, Cauchy, wykładnicze itp.), czy istnieją zautomatyzowane sposoby znalezienia odpowiedniego rozkładu i parametrów rozkładu dla danych? Czy są jakieś dobre samouczki, które przeprowadzą mnie przez ten proces?

Scenariusz realny: Na przykład, załóżmy, że zainicjowałem małą ankietę i zarejestrowałem informacje o tym, z jaką liczbą osób rozmawia dana osoba każdego dnia, powiedzmy 300 osób, i mam następujące informacje informacja:

1 10
2 5
3 20
...
...

Gdzie X Y mówi mi, że osoba X rozmawiała z ludźmi Y w okresie badania. Korzystając z informacji od 300 osób, chcę dopasować to do modelu. Pytanie sprowadza się do tego, czy istnieją jakieś zautomatyzowane sposoby znalezienia właściwych parametrów dystrybucji i dystrybucji dla tych danych, a jeśli nie, czy istnieje dobra procedura krok po kroku, aby osiągnąć to samo?

Author: Legend, 2010-11-27

6 answers

To skomplikowane pytanie i nie ma doskonałych odpowiedzi. Postaram się dać ci przegląd głównych pojęć i wskazać ci kierunek przydatnej lektury na ten temat.

Załóżmy, że masz jednowymiarowy zbiór danych i masz skończony zbiór funkcji rozkładu prawdopodobieństwa, z których dane mogły zostać wygenerowane. Możesz rozważyć każdą dystrybucję niezależnie i spróbować znaleźć parametry, które są rozsądne, biorąc pod uwagę Twoje dane. Są dwie metody wyznaczania parametrów dla funkcji rozkładu prawdopodobieństwa podanych danych:

  1. Najmniejsze Kwadraty
  2. Maksymalne Prawdopodobieństwo

Z mojego doświadczenia wynika, że w ostatnich latach preferowano maksymalne prawdopodobieństwo, chociaż może to nie mieć miejsca w każdej dziedzinie.

Oto konkretny przykład jak oszacować parametry w R. rozważmy zbiór losowych punktów generowanych z rozkładu Gaussa ze średnią 0 i odchyleniem standardowym z 1:

x = rnorm( n = 100, mean = 0, sd = 1 )

Załóżmy, że wiesz, że dane zostały wygenerowane za pomocą procesu Gaussa, ale zapomniałeś (lub nigdy nie wiedziałeś!) parametry Gaussa. Chciałbyś wykorzystać te dane, aby uzyskać rozsądne szacunki średniej i odchylenia standardowego. W R istnieje standardowa biblioteka, która czyni to bardzo prostym:

library(MASS)
params = fitdistr( x, "normal" )
print( params )

To dało mi następujące wyjście:

      mean           sd     
  -0.17922360    1.01636446 
 ( 0.10163645) ( 0.07186782)

Są dość bliskie właściwej odpowiedzi, a liczby w nawiasach są pewne odstępy wokół parametrów. Pamiętaj, że za każdym razem, gdy wygenerujesz nowy zestaw punktów, otrzymasz nową odpowiedź na szacunki.

Matematycznie, to jest przy użyciu maksymalnego prawdopodobieństwa oszacować zarówno średnie i odchylenie standardowe Gaussa. Prawdopodobieństwo oznacza (w tym przypadku) " prawdopodobieństwo danych podanych wartości parametrów."Maksymalne prawdopodobieństwo" oznacza wartości parametrów, które maksymalizują prawdopodobieństwo generowania moich danych wejściowych."Maksymalne oszacowanie prawdopodobieństwa to algorytm do znajdowania wartości parametrów, które maksymalizują prawdopodobieństwo wygenerowania danych wejściowych, a dla niektórych rozkładów może obejmować algorytmy optymalizacji numerycznej . W R większość pracy jest wykonywana przez fitdistr, który w niektórych przypadkach wywoła optim.

Możesz wyodrębnić prawdopodobieństwo logowania ze swoich parametrów w następujący sposób:

print( params$loglik )
[1] -139.5772

Częściej pracuje się z prawdopodobieństwem logowania niż z prawdopodobieństwem unikania zaokrąglania błędy. Oszacowanie wspólnego prawdopodobieństwa danych obejmuje mnożenie prawdopodobieństwa, które są mniejsze niż 1. Nawet w przypadku małego zbioru danych wspólne prawdopodobieństwo bardzo szybko zbliża się do 0, a dodanie prawdopodobieństwa logowania danych jest równoznaczne z pomnożeniem prawdopodobieństwa. Prawdopodobieństwo jest zmaksymalizowane, gdy prawdopodobieństwo logowania zbliża się do 0, a tym samym więcej liczb ujemnych jest gorzej dopasowanych do Twoich danych.

Dzięki takim narzędziom obliczeniowym łatwo jest oszacować parametry dla każda dystrybucja. Rozważ ten przykład:

x = x[ x >= 0 ]

distributions = c("normal","exponential")

for ( dist in distributions ) {
    print( paste( "fitting parameters for ", dist ) )
    params = fitdistr( x, dist )
    print( params )
    print( summary( params ) )
    print( params$loglik )
}

Rozkład wykładniczy nie generuje liczb ujemnych, więc usunąłem je w pierwszej linii. Wyjście (które jest stochastyczne) wyglądało tak:

[1] "fitting parameters for  normal"
      mean          sd    
  0.72021836   0.54079027 
 (0.07647929) (0.05407903)
         Length Class  Mode   
estimate 2      -none- numeric
sd       2      -none- numeric
n        1      -none- numeric
loglik   1      -none- numeric
[1] -40.21074
[1] "fitting parameters for  exponential"
     rate  
  1.388468 
 (0.196359)
         Length Class  Mode   
estimate 1      -none- numeric
sd       1      -none- numeric
n        1      -none- numeric
loglik   1      -none- numeric
[1] -33.58996
Rozkład wykładniczy jest w rzeczywistości nieco bardziej prawdopodobny do wygenerowania tych danych niż rozkład normalny, prawdopodobnie dlatego, że rozkład wykładniczy nie musi przypisywać żadnej gęstości prawdopodobieństwa liczbom ujemnym.

Wszystkie te szacunki problemy pogarszają się, gdy próbujesz dopasować swoje dane do większej liczby dystrybucji. Dystrybucje o większej liczbie parametrów są bardziej elastyczne, więc lepiej pasują do danych niż dystrybucje o mniejszej liczbie parametrów. Również niektóre dystrybucje są szczególnymi przypadkami innych dystrybucji (na przykład wykładniczy jest szczególnym przypadkiem Gamma). Z tego powodu bardzo często używa się wcześniejszej wiedzy, aby ograniczyć wybrane modele do podzbioru wszystkich możliwych modeli.

Jedna sztuczka aby obejść pewne problemy w estymacji parametrów, należy wygenerować wiele danych i pozostawić niektóre dane na cross-validation. Aby zweryfikować dopasowanie parametrów do danych, pomiń niektóre dane z procedury szacowania, a następnie zmierz prawdopodobieństwo każdego modelu na pominiętych danych.
 37
Author: James Thompson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-27 05:05:32

Spójrz na fitdistrplus (http://cran.r-project.org/web/packages/fitdistrplus/index.html).

Kilka szybkich rzeczy do zapamiętania:

  • Wypróbuj funkcję descdist, która dostarcza wykresu skośnego vs. kurtosis danych, a także pokazuje niektóre wspólne dystrybucje.
  • fitdist pozwala dopasować dowolne rozkłady, które można zdefiniować w kategoriach gęstości i cdf.
  • możesz następnie użyć gofstat, który oblicza statystyki KS I AD, które mierzą odległość dopasowania od dane.
 10
Author: Ramnath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-05 22:15:09

Jest to prawdopodobnie trochę bardziej ogólne niż potrzebujesz, ale może dać ci coś do kontynuowania.

Jednym ze sposobów oszacowania funkcji gęstości prawdopodobieństwa na podstawie losowych danych jest użycie rozszerzenia Edgewortha lub Butterwortha. Te przybliżenia wykorzystują właściwości funkcji gęstości znane jako kumulanty (bezstronnymi estymatorami, dla których są K-statystyka) i wyrazić funkcję gęstości jako perturbację z rozkładu Gaussa.

These both mają dość poważne słabości, takie jak tworzenie rozbieżnych funkcji gęstości, a nawet funkcji gęstości, które są ujemne w niektórych regionach. Jednak niektórzy ludzie uważają je za przydatne dla wysoce skupionych danych, lub jako punkty wyjścia do dalszego szacowania, lub dla fragmentarycznych funkcji szacowanej gęstości, lub jako część heurystyki.

M. G. Kendall and A. Stuart, the advanced theory of statistics, vol. 1, Charles Griffin, 1963, był najbardziej kompletnym odniesieniem, jakie znalazłem dla tego, z cała strona poświęcona tematowi. większość innych tekstów miała na niej co najwyżej zdanie lub wymieniała rozbudowę w kategoriach momentów zamiast kumulantów, co jest nieco bezużyteczne. Powodzenia w znalezieniu kopii, ale musiałem wysłać mojego bibliotekarza uniwersyteckiego na wycieczkę do archiwum dla niego... ale to było lata temu, więc może internet będzie bardziej pomocny dzisiaj.

Najbardziej ogólną formą twojego pytania jest temat pola znanego jako gęstość nieparametryczna oszacowanie , gdzie podane:

  • dane z losowego procesu o nieznanym rozkładzie i
  • ograniczenia procesu bazowego

...tworzysz funkcję gęstości, która jest najbardziej prawdopodobna do wytworzenia danych. (Bardziej realistycznie tworzy się metodę obliczania przybliżenia do tej funkcji w dowolnym punkcie, którą można wykorzystać do dalszej pracy, np. porównując funkcje gęstości z dwóch zestawów losowych danych, aby sprawdzić, czy mogło pochodzić z tego samego procesu).

Osobiście nie miałem szczęścia w korzystaniu z nieparametrycznego szacowania gęstości dla czegokolwiek użytecznego, ale jeśli masz stały zapas zdrowego rozsądku, powinieneś się temu przyjrzeć.

 5
Author: detly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-27 07:25:45

Zasadniczo chcesz porównać swoje dane ze świata rzeczywistego do zestawu rozkładów teoretycznych. Istnieje funkcja qqnorm() w bazie R, która zrobi to dla rozkładu normalnego, ale wolę funkcję probplot w e1071, która pozwala testować inne rozkłady. Oto fragment kodu, który wykreśli twoje prawdziwe dane na podstawie każdej z rozkładów teoretycznych, które wkleimy na listę. Używamy plyr, aby przejść przez listę, ale istnieje kilka innych sposobów, aby przejść przez Lista również.

library("plyr") 
library("e1071")

realData <- rnorm(1000) #Real data is normally distributed

distToTest <- list(qnorm = "qnorm", lognormal = "qlnorm", qexp =  "qexp")

#function to test real data against list of distributions above. Output is a jpeg for each distribution.
testDist <- function(x, data){
    jpeg(paste(x, ".jpeg", sep = ""))
    probplot(data, qdist = x)
    dev.off()
    }

l_ply(distToTest, function(x) testDist(x, realData))
 3
Author: Chase,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-27 04:59:31

Nie jestem naukowcem, ale gdybyś robił to ołówkiem i papierem, oczywistym sposobem byłoby zrobienie wykresu, a następnie porównanie wykresu do jednego ze znanych standardów-rozkładu.

Idąc dalej z tą myślą, "porównywanie" to szukanie, czy krzywe rozkładu standardowego i Twojego są podobne.

Trygonometria, tangens... to moja ostatnia myśl.

Nie jestem ekspertem, tylko kolejnym skromnym Web developerem=)

 2
Author: TomWilde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-27 04:29:42

Jeśli to coś znaczy, to może warto przyjrzeć się rozkładowi Poissona.

 -4
Author: Ghalib Suleiman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-27 04:54:08