在 R 中模拟肥尾数据
Simulate fat tail data in R
我需要在 R 中模拟具有肥尾分布的数据,并且在我不确定从哪里开始之前从未模拟过数据。我查看了 FatTailsR
包,但文档非常神秘,我似乎找不到任何明显的教程。
基本上,我想创建一个人工数据框,其中包含两列(X 和 Y),包含 10,000 个观察值,使用以下 logic/iterations:
- 对于 X 的每个观察值,Y 为 0 的概率为 75%,Y 为 1 的概率为 25%(将每个观察值指定为 0 或 1)。
- 接下来,仅查看 Y 为 1 的 X 的观测值。在这些观测值(原始数据集的 25%)中,有 25% 的 Y 为 2。
- 在 Y 为 2 的观察结果中,25% 的结果提高到 3。
- 并以此类推直到 Y = 10。
如有任何指导,我们将不胜感激。包括要签出的包和函数的建议(可能类似于 rlnorm
?)
这可能有效(不是超级高效,但是......)
先算出每个结果的概率(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)
我需要在 R 中模拟具有肥尾分布的数据,并且在我不确定从哪里开始之前从未模拟过数据。我查看了 FatTailsR
包,但文档非常神秘,我似乎找不到任何明显的教程。
基本上,我想创建一个人工数据框,其中包含两列(X 和 Y),包含 10,000 个观察值,使用以下 logic/iterations:
- 对于 X 的每个观察值,Y 为 0 的概率为 75%,Y 为 1 的概率为 25%(将每个观察值指定为 0 或 1)。
- 接下来,仅查看 Y 为 1 的 X 的观测值。在这些观测值(原始数据集的 25%)中,有 25% 的 Y 为 2。
- 在 Y 为 2 的观察结果中,25% 的结果提高到 3。
- 并以此类推直到 Y = 10。
如有任何指导,我们将不胜感激。包括要签出的包和函数的建议(可能类似于 rlnorm
?)
这可能有效(不是超级高效,但是......)
先算出每个结果的概率(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)