Имитация данных жирного хвоста в 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)