Имитация данных жирного хвоста в R

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

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

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

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

2 ответа

Решение

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

Сначала выясните вероятности каждого исхода (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 

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

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

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)
Другие вопросы по тегам