Подтвердить что ты не робот

Установка данных в дистрибутивы?

Я не статистик (больше исследовательский веб-разработчик), но я много слышал о scipy и R в эти дни. Поэтому из любопытства я хотел задать этот вопрос (хотя это может показаться глупым для экспертов здесь), потому что я не уверен в достижениях в этой области и хочу знать, как люди, не имеющие надежной статистики, подходят к этим проблемам.

Учитывая набор действительных чисел, наблюдаемых из эксперимента, скажем, они принадлежат одному из многих распределений (например, Вейбулл, Эрланг, Коши, Экспоненциальный и т.д.), есть ли какие-либо автоматические способы нахождения правильного распределения и параметры распределения данных? Есть ли хорошие учебники, которые меня проходят через этот процесс?

Сценарий реального мира: Например, предположим, что я инициировал небольшой опрос и записал информацию о том, сколько людей человек разговаривает каждый день, скажем 300 человек, и у меня есть следующая информация:

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

где X Y говорит мне, что человек X говорил с Y людьми в течение периода опроса. Теперь, используя информацию от 300 человек, я хочу подгонять это в модель. Вопрос сводится к тому, есть ли какие-либо автоматические способы определения правильных параметров распределения и распределения для этих данных, а если нет, есть ли пошаговая процедура для достижения того же?

4b9b3361

Ответ 1

Это сложный вопрос, и нет идеальных ответов. Я попытаюсь дать вам обзор основных концепций и указать вам направление некоторого полезного чтения по этой теме.

Предположим, что у вас одномерный набор данных, и у вас есть конечный набор функций распределения вероятности, которые, по вашему мнению, могут быть получены. Вы можете рассматривать каждый дистрибутив самостоятельно и пытаться найти параметры, которые являются разумными с учетом ваших данных. Существует два метода задания параметров для функции распределения вероятности: данные

По моему опыту, в последние годы предпочтение отдается максимальному количеству правдоподобия, хотя это может быть не во всех областях.

Здесь приведен конкретный пример того, как оценивать параметры в R. Рассмотрим набор случайных точек, порожденных гауссовским распределением со средним значением 0 и стандартным отклонением 1:

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

Предположим, что вы знаете, что данные были сгенерированы с использованием процесса Гаусса, но вы забыли (или никогда не знали!) параметры для гауссова. Вы хотите использовать данные, чтобы дать вам разумные оценки среднего и стандартного отклонения. В R существует стандартная библиотека, которая делает это очень простой:

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

Это дало мне следующий результат:

      mean           sd     
  -0.17922360    1.01636446 
 ( 0.10163645) ( 0.07186782)

Это довольно близко к правильному ответу, а числа в круглых скобках - это доверительные интервалы вокруг параметров. Помните, что каждый раз, когда вы создаете новый набор точек, вы получите новый ответ для оценок.

Математически это использует максимальную вероятность для оценки среднего и стандартного отклонения гауссова. Вероятность означает (в данном случае) "вероятность данных при заданных значениях параметров". Максимальное правдоподобие означает "значения параметров, которые максимизируют вероятность генерации моих входных данных". Оценка максимального правдоподобия - это алгоритм для нахождения значений параметров, которые максимизируют вероятность генерации входных данных, а для некоторых распределений он может включать численная оптимизация алгоритмы. В R большая часть работы выполняется fitdistr, которая в некоторых случаях вызывает optim.

Вы можете извлечь лог-правдоподобие из своих параметров следующим образом:

print( params$loglik )
[1] -139.5772

Чаще всего работает с лог-правдоподобием, а не с вероятностью избегать ошибок округления. Оценка совместной вероятности ваших данных связана с умножением вероятностей, которые все меньше 1. Даже для небольшого набора данных общая вероятность приближается к 0 очень быстро, и добавление логарифмических вероятностей ваших данных эквивалентно умножению вероятностей. Вероятность максимизируется по мере приближения логарифмического правдоподобия к 0, и, следовательно, более отрицательные числа хуже подходят для ваших данных.

С помощью таких вычислительных инструментов легко оценить параметры для любого распределения. Рассмотрим этот пример:

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 )
}

Экспоненциальное распределение не генерирует отрицательные числа, поэтому я удалил их в первой строке. Выход (который стохастический) выглядит следующим образом:

[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

Экспоненциальное распределение на самом деле несколько более вероятно генерирует эти данные, чем нормальное распределение, вероятно, потому что экспоненциальное распределение не должно связывать любую плотность вероятности с отрицательными числами.

Все эти проблемы с оценкой ухудшаются, когда вы пытаетесь подогнать свои данные к большему количеству распределений. Распределения с большим количеством параметров более гибкие, поэтому они будут лучше соответствовать вашим данным, чем распределения с меньшими параметрами. Кроме того, некоторые дистрибутивы являются особыми случаями других распределений (например, Exponential является частным случаем Gamma). Из-за этого очень часто используется предварительное знание, чтобы ограничить ваши модели выбора подмножеством всех возможных моделей.

Один трюк, чтобы обойти некоторые проблемы при оценке параметров, состоит в том, чтобы сгенерировать много данных и оставить некоторые данные для cross-validation. Чтобы перекрестно проверить правильность параметров данных, оставьте некоторые данные из вашей процедуры оценки, а затем измерьте каждую вероятностную модель по остальным данным.

Ответ 2

Взгляните на fitdistrplus (http://cran.r-project.org/web/packages/fitdistrplus/index.html).

Несколько быстрых заметок:

  • Попробуйте функцию descdist, которая обеспечивает график перекоса и эксцесса данных, а также показывает некоторые распространенные распределения.
  • fitdist позволяет вам сопоставлять любые дистрибутивы, которые вы можете определить с точки зрения плотности и cdf.
  • Затем вы можете использовать gofstat, который вычисляет статистику KS и AD, которые измеряют расстояние от подгонки от данных.

Ответ 3

Это, вероятно, немного более общий, чем вам нужно, но может дать вам кое-что, чтобы продолжить.

Одним из способов оценки функции плотности вероятности от случайных данных является использование расширения Эджворта или Баттерворта. Эти аппроксимации используют свойства функции плотности, известные как кумулянты (несмещенные оценки, для которых k-статистика) и выразить функцию плотности как возмущение из гауссова распределения.

У этих обоих есть некоторые довольно серьезные недостатки, такие как создание расходящихся функций плотности или даже функции плотности, которые отрицательны в некоторых регионах. Однако некоторые люди считают их полезными для данных с высокой степенью кластеризации или в качестве отправных точек для дальнейшей оценки или для кусочно оцененных функций плотности или как часть эвристики.

М. Г. Кендалл и А. Стюарт, Передовая теория статистики, т. 1, Чарльз Гриффин, 1963, был самой полной ссылкой, которую я нашел для этого, с цельной цельной страницей, посвященной этой теме; большинство других текстов содержало в нем предложение в лучшем случае или перечисляло расширение с точки зрения моментов вместо кумулянтов, что немного бесполезно. Если вам удастся найти копию, я должен был отправить своего университетского библиотекаря на поездку в архив для этого... но это было много лет назад, поэтому, возможно, сегодня Интернет станет более полезным.

Наиболее общей формой вашего вопроса является тема поля, известная как непараметрическая оценка плотности, где указано:

  • данные из случайного процесса с неизвестным распределением и
  • ограничения на основной процесс

... вы создаете функцию плотности, которая, скорее всего, создала данные. (Более реалистично вы создаете метод вычисления приближения к этой функции в любой заданной точке, которую вы можете использовать для дальнейшей работы, например, сравнивая функции плотности из двух наборов случайных данных, чтобы увидеть, могли ли они исходить из того же процесс).

Лично, однако, мне не повезло в использовании оценки непараметрической плотности для чего-либо полезного, но если у вас есть устойчивый уровень здравомыслия, вы должны изучить его.

Ответ 4

Вы по сути хотите сравнить свои данные реального мира с набором теоретических распределений. В базе R есть функция qqnorm(), которая будет делать это для нормального распределения, но я предпочитаю функцию probplot в e1071, которая позволяет тестировать другие дистрибутивы. Вот фрагмент кода, который будет отображать ваши реальные данные против каждого из теоретических распределений, которые мы вставляем в список. Мы используем plyr для просмотра списка, но есть еще несколько способов пройти через список.

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))

Ответ 5

Я не ученый, но если бы вы делали это с карандашом бумаги, очевидным способом было бы сделать граф, а затем сравнить график с одним из известных стандартных распределений.

Идя дальше с этой мыслью, "сравнение" смотрит, похожи ли кривые стандартного распределения и вашего.

Тригонометрия, касательные... были бы моей последней мыслью.

Я не эксперт, просто еще один скромный веб-разработчик =)

Ответ 6

Для чего это стоит, похоже, вам захочется взглянуть на распределение Пуассона.