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

Как генерировать распределенные данные, средние, SD, перекос и эксцесс в R?

Можно ли генерировать распределения в R, для которых известны Mean, SD, skew и kurtosis? Пока, кажется, лучшим маршрутом будет создание случайных чисел и их трансформация соответственно. Если есть пакет, предназначенный для создания конкретных дистрибутивов, которые можно было бы адаптировать, я еще не нашел его. Благодаря

4b9b3361

Ответ 1

В пакете SuppDists есть распределение Джонсона. Джонсон даст вам распределение, которое соответствует моменту или квантилям. Другие комментарии верны, что 4 момента не распространяются. Но Джонсон непременно попытается.

Здесь приведен пример подбора Джонсона к некоторым образцовым данным:

require(SuppDists)

## make a weird dist with Kurtosis and Skew
a <- rnorm( 5000, 0, 2 )
b <- rnorm( 1000, -2, 4 )
c <- rnorm( 3000,  4, 4 )
babyGotKurtosis <- c( a, b, c )
hist( babyGotKurtosis , freq=FALSE)

## Fit a Johnson distribution to the data
## TODO: Insert Johnson joke here
parms<-JohnsonFit(babyGotKurtosis, moment="find")

## Print out the parameters 
sJohnson(parms)

## add the Johnson function to the histogram
plot(function(x)dJohnson(x,parms), -20, 20, add=TRUE, col="red")

Заключительный сюжет выглядит следующим образом:

enter image description here

Вы можете увидеть немного проблемы, которые другие указывают на то, как 4 момента не полностью захватывают дистрибутив.

Удачи!

ИЗМЕНИТЬ Как заметил Хэдли в комментариях, Джонсон подходит. Я сделал быстрый тест и поместил распределение Джонсона, используя moment="quant", который соответствует распределению Джонсона, используя 5 квантилей вместо 4 моментов. Результаты выглядят намного лучше:

parms<-JohnsonFit(babyGotKurtosis, moment="quant")
plot(function(x)dJohnson(x,parms), -20, 20, add=TRUE, col="red")

Что дает следующее:

enter image description here

У кого-нибудь есть идеи, почему Джонсон кажется предвзятым, когда он подходит с помощью моментов?

Ответ 2

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

Вот несколько способов решения этой проблемы:

  • Предположим, что основные моменты распределения и соответствия. Для этого существует множество стандартных пакетов R. Один недостаток заключается в том, что многомерное обобщение может быть неясным.

  • Приближения седлочной точки. В этой статье:

    Gillespie, C.S. and Renshaw, E. Улучшенное приближение седловой точки. Математические биологические науки, 2007.

    Мы смотрим на восстановление pdf/pmf, если заданы только первые несколько моментов. Мы обнаружили, что этот подход работает, когда асимметрия не слишком велика.

  • Расширения Laguerre:

    Мустафа, Х. и Димитракопулоса, Р. Обобщенные расширения Лагерра многомерных вероятностных плотностей с моментами. Компьютеры и математика с приложениями, 2010.

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

Ответ 3

Этот вопрос задавали более 3 лет назад, поэтому я надеюсь, что мой ответ не придет слишком поздно.

Существует способ однозначно идентифицировать распределение, зная некоторые моменты. Таким способом является метод Максимальная энтропия. Распределение, которое получается из этого метода, - это распределение, которое максимизирует ваше незнание структуры структуры, учитывая то, что вы знаете. Любое другое распределение, которое также имеет моменты, которые вы указали, но не является дистрибутивом MaxEnt, неявно предполагает большую структуру, чем то, что вы вводите. Функционал для максимизации - информационная энтропия Шеннона, $S [p (x)] = -\int p (x) log p (x) dx $. Зная среднее, sd, асимметрию и эксцесс, переводите как ограничения на первый, второй, третий и четвертый моменты распределения соответственно.

Проблема заключается в том, чтобы максимизировать S с учетом ограничений: 1) $\ int x p (x) dx = "первый момент" $, 2) $\ int x ^ 2 p (x) dx = "второй момент" $, 3)... и т.д.

Я рекомендую книгу "Harte, J., Maximum Entropy and Ecology: теория изобилия, распространения и энергетики" (Oxford University Press, New York, 2011).

Вот ссылка, которая пытается реализовать это в R: https://stats.stackexchange.com/questions/21173/max-entropy-solver-in-r

Ответ 4

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

Один предложенный подход выглядит следующим образом:

  • Используйте преобразование Флейшмана, чтобы получить коэффициент для данного перекоса и эксцесса. Fleishman берет косы и эксцессы и дает вам коэффициенты
  • Генерировать N нормальных переменных (среднее value = 0, std = 1)
  • Преобразование данных в (2) с коэффициентами Флейшмана для преобразования нормальных данных в заданный косой и эксцесс
  • На этом шаге используйте данные с шага (3) и преобразуйте его в желаемое среднее и стандартное отклонение (std), используя new_data = желаемое среднее + (данные с шага 3) * желаемый std

Полученные данные этапа 4 будут иметь желаемое среднее значение, std, асимметрию и эксцесс.

Предостережения:

  • Fleishman не будет работать для всех комбинаций асимметрии и куртуа.
  • Вышеуказанные шаги предполагают некоррелированные переменные. Если вы хотите создать коррелированные данные, вам понадобится шаг перед преобразованием Fleishman.

Ответ 5

Одним из решений для вас может быть библиотека PearsonDS. Это позволяет использовать комбинацию первых четырех моментов с ограничением, что куртоз> асимметрия ^ 2 + 1.

Чтобы сгенерировать 10 случайных значений из этого распределения, попробуйте:

library("PearsonDS")
moments <- c(mean = 0,variance = 1,skewness = 1.5, kurtosis = 4)
rpearson(10, moments = moments)

Ответ 6

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

Ответ 7

Метод энтропии - хорошая идея, но если у вас есть образцы данных, вы используете больше информации по сравнению с использованием только моментов! Поэтому момент подгонки часто менее стабилен. Если у вас нет больше информации о том, как выглядит дистрибутив, энтропия - это хорошая концепция, но если у вас есть больше информации, например, о поддержке, используйте ее! Если ваши данные искажены и положительны, то лучше использовать логнормальную модель. Если вы также знаете, что верхний хвост конечен, то не используйте логнормальное распределение, но, возможно, бета-распределение с 4 параметрами. Если ничего не известно о опорных или хвостовых характеристиках, то, возможно, хорошо подходит масштабированная и смещенная логнормальная модель. Если вам нужна большая гибкость в отношении куртоза, то, например, logT с масштабированием + смещением часто подойдет. Также может помочь, если вы знаете, что подгонка должна быть почти нормальной, если это так, тогда используйте модель, которая включает нормальное распределение (часто так или иначе), в противном случае вы можете, например, использовать обобщенное секуще-гиперболическое распределение. Если вы хотите сделать все это, то в какой-то момент модель будет иметь несколько разных случаев, и вы должны убедиться, что нет пропусков или плохих эффектов перехода.

Ответ 8

Как уже отмечали @David и @Carl, существует несколько пакетов, предназначенных для генерации разных дистрибутивов, см., например, Обзор задач распределения вероятностей на CRAN.

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

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