Имитация данных жирного хвоста в R - PullRequest
0 голосов
/ 26 февраля 2019

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

По сути, я хочу создать искусственный фрейм данных с двумя столбцами (X и Y)из 10000 наблюдений, которые используют следующую логику / итерации:

  • Для каждого наблюдения X существует 75% вероятности того, что Y равно 0, и 25% вероятности Y равно 1 (присваивая каждому наблюдению a0 или 1).
  • Далее, посмотрите только на наблюдения X, где Y равно 1. Из этих наблюдений (25% исходного набора данных) есть 25%, что Y равно 2.
  • Из наблюдений, где Y равен 2, 25% увеличиваются до 3.
  • И повторяются и так до Y = 10.

Любое руководство будет оценено.Включая предложения пакетов и функций для проверки (может быть что-то вроде rlnorm?)

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Вот что я понял из вашего вопроса:

data <- data.frame(X=1:10000, Y=sample(c(0,1), 10000, TRUE, prob=c(0.75, 0.25)))
head(data)

pos <- which(data$Y == 1)
pos <- sample(pos, floor(0.25*length(pos)), FALSE)  # 25% of Y == 1

data[pos, "Y"] <- data[pos, "Y"] + 1

## Iterate using a while loop :

data <- data.frame(X=1:10000, Y=sample(c(0,1), 10000, TRUE, prob=c(0.75, 0.25)))
head(data)

i <- 0

while(i < 10) {
  pos <- which(data$Y == (i + 1))
  pos <- sample(pos, floor(0.25*length(pos)), FALSE)  # 25% of Y == 1

  data[pos, "Y"] <- data[pos, "Y"] + 1

  i <- i + 1
}

hist(data$Y)
0 голосов
/ 26 февраля 2019

Это может сработать (не суперэффективно, но ...)

Сначала выясните вероятности каждого исхода (P (1) = 0,75, P (2) = 0,75 * 0,25, P (3) = 0,75 * 0,25 ^ 2 ...)

cc <- cumprod(c(0.75,rep(0.25,9)))

Выберите полиномиальное отклонение с этими вероятностями (N = 1 для каждого образца)

rr <- t(rmultinom(1000,size=1,prob=cc))

Определите, какое значение вкаждая строка равна 1:

storage.mode(rr) <- "logical"
out <- apply(rr,1,which)

Результаты проверки:

tt <- table(factor(out,levels=1:10))
  1   2   3   4   5   6   7   8   9  10 
756 183  43  14   3   1   0   0   0   0 

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

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