Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中模拟胖尾数据_R_Distribution_Simulate_Probabilistic Programming - Fatal编程技术网

在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 然

我需要用厚尾分布模拟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
  • 然后依次迭代,直到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)