Определение распределения, чтобы я мог генерировать тестовые данные - PullRequest
3 голосов
/ 17 июня 2009

У меня около 100M пар значение / количество в текстовом файле на моем компьютере с Linux. Я хотел бы выяснить, какую формулу я бы использовал, чтобы генерировать больше пар, которые следуют тому же распределению.

Судя по случайной проверке, это выглядит как степенной закон, но мне нужно быть более строгим. Может ли R сделать это легко? Если так, то как? Есть ли что-то еще, что работает лучше?

Ответы [ 3 ]

4 голосов
/ 17 июня 2009

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

4 голосов
/ 17 июня 2009

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

Вам нужна файловая структура, в которой можно быстро найти «самую высокую запись с ключом <= X» - например, в базе данных Sleepycat's Berkeley есть структура btree; SQLite еще проще, хотя, возможно, не так быстро (но с индексом на ключе все должно быть в порядке). </p>

Поместите ваши данные в виде пар, где ключ - кумулятивный счет до этой точки (отсортированный по возрастанию значения). Назовите K самой высокой клавишей.

Чтобы сгенерировать случайную пару, которая соответствует точно тому же распределению, что и образец, сгенерируйте случайное целое число X между 0 и K и найдите его в этой файловой структуре с упомянутым «самым высоким, что <=» и используйте соответствующее значение. </p>

Не уверен, как сделать все это в R - на вашем месте я бы попробовал мост Python / R, выполнил бы логику и контроль в Python и только статистику в самом R, но это личный выбор!

1 голос
/ 27 июня 2009

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

Лучший способ создания «новых» данных - это выборка из ваших существующих данных с помощью функции R sample (). Это даст вам значения, которые соответствуют распределению вероятностей, указанному вашими существующими значениями.

Чтобы дать тривиальный пример, давайте предположим, что у вас есть файл данных об избирателях для небольшого города, где значения - это политическая принадлежность избирателей, а число - число избирателей:

affils <- as.factor(c('democrat','republican','independent'))
counts <- c(552,431,27)
## Simulate 20 new voters, sampling from affiliation distribution
new.voters <- sample(affils,20, replace=TRUE,prob=counts)
new.counts <- table(new.voters)

На практике вы, вероятно, внесете свои 100-метровые строки значений и подсчетов, используя функцию read.csv () в R. Предполагая, что у вас есть строка заголовка, помеченная «values ​​\ t count», этот код может выглядеть примерно так:

dat <- read.csv('values-counts.txt',sep="\t",colClasses=c('factor','numeric'))
new.dat <- sample(dat$values,100,replace=TRUE,prob=dat$counts)

Одно предостережение: как вы, возможно, знаете, R хранит все свои объекты в памяти, поэтому убедитесь, что у вас достаточно свободного места для 100-метровых строк данных (хранение символьных строк как факторов поможет уменьшить площадь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...