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

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

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

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

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

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

6 Solutions collect form web for “Установка данных в дистрибутивы?”

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

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

  1. Наименьших квадратов
  2. Максимальное количество правдоподобия

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

Вот конкретный пример того, как оценивать параметры в 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 , который в некоторых случаях будет называться оптимизированным .

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

 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 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Вы по сути хотите сравнить свои данные в реальном мире с набором теоретических распределений. В базе R есть функция qqnorm() , которая будет делать это для нормального распределения, но я предпочитаю функцию e1071 в 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)) 

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

Python - лучший язык программирования в мире.