在R中模拟胖尾数据
我需要用厚尾分布模拟R中的数据,而且在我不确定从哪里开始之前从未模拟过数据。我已经研究了在R中模拟胖尾数据,r,distribution,simulate,probabilistic-programming,R,Distribution,Simulate,Probabilistic Programming,我需要用厚尾分布模拟R中的数据,而且在我不确定从哪里开始之前从未模拟过数据。我已经研究了FatTailsR软件包,但是文档非常神秘,我似乎找不到任何明显的教程 基本上,我想创建一个包含两列(X和Y)的人工数据框,共10000个观察值,使用以下逻辑/迭代: 对于X的每个观测值,Y为0的概率为75%,Y为1的概率为25%(将每个观测值指定为0或1) 接下来,只看X的观测值,其中Y是1。在这些观察数据中(原始数据集的25%),有25%的数据表示Y为2 在Y为2的观测值中,25%的观测值会上升到3 然
FatTailsR
软件包,但是文档非常神秘,我似乎找不到任何明显的教程
基本上,我想创建一个包含两列(X和Y)的人工数据框,共10000个观察值,使用以下逻辑/迭代:
- 对于X的每个观测值,Y为0的概率为75%,Y为1的概率为25%(将每个观测值指定为0或1)
- 接下来,只看X的观测值,其中Y是1。在这些观察数据中(原始数据集的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这是我从你的问题中了解到的:
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)
data很高兴看到您在这方面做了哪些尝试。看起来像是一个for
循环,您只需要runif
或sample
或rbinom
中的一个。您的第一个项目符号是y=sample(0:1,大小=10000,prob=c(0.75,0.25),replace=TRUE)
。或者y=ifelse(runif(10000)>0.75,1,0)
。或者y=rbinom(10000,大小=1,概率=0.25)
。选择你最喜欢的语法。(还有,X
列的意义是什么?您经常提到它,但从不谈论它的值。似乎只生成一个向量Y
会更简单,因为X
什么都不做…)我沿着这条路径开始,但在OP的迭代过程中,2是由1组成的,所以P(1)=0.25-和(0.25)^(2:10)
(我认为您有一个输入错误,第一次迭代中的原始P(1)是0.25,而不是0.75)。如果我们这样做,那么我认为数字1:10的问题是0.25^(1:10)-c(修订版(cumsum(0.25^(10:2)),0)
分别,但我有一个错误,因为它们的总和应该是0.25
一个这个总和是0.222252
。但是我也忘记了零。如果你在我之前找到它,请随意编辑,或者发布你自己的更正版本(如果必要,我会删除).Eh,看起来像是家庭作业,所以除非OP显示了相当多的代码,否则我可能不会发布答案。不过这是一个很好的小谜题。呃,我用cumsum
和所有的东西把它过度复杂化了。1:10
的概率是p=0.25^(1:10);p=p-c(p[-1],0)
。对于已知的迭代次数来说,这个答案很好(1:10中的i)
比在while
循环中手动递增i
更简单、更安全。
rr <- t(rmultinom(1000,size=1,prob=cc))
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)