在 R 中生成具有不同样本大小的多项式随机变量
generate multinomial random varibles with varying sample size in R
我需要生成具有不同样本大小的多项式随机变量。
假设我已经生成了如下样本量,
samplesize =c(50,45,40,48)
然后我需要根据这个不同的样本量生成多项式随机变量。我尝试使用 for 循环并使用应用函数 (sapply)。
使用 For 循环,
p1=c(0.4,0.3,0.3)
for( i in 1:4)
{
xx1[i]=rmultinom(4, samplesize[i], p1)
}
如果我的代码是正确的,那么我应该得到一个有 4 列和 3 行的矩阵。其中列总计应等于样本大小中的每个值。但我不明白。
使用应用,
sapply( samplesize ,function(x)
{
rmultinom(10, samplesize[x], p1)
})
我在这里也遇到了错误。
所以谁能帮我弄清楚哪里出了问题?
谢谢
samplesize <- c(50, 45, 40, 48)
p <- c(0.4, 0.3, 0.3)
## method 1
set.seed(0)
xx1 <- matrix(0, length(p), length(samplesize))
for(i in 1:length(samplesize)) {
xx1[, i] <- rmultinom(1, samplesize[i], p)
}
xx1
# [,1] [,2] [,3] [,4]
#[1,] 24 17 20 24
#[2,] 11 14 8 16
#[3,] 15 14 12 8
colSums(xx1)
#[1] 50 45 40 48
## method 2
set.seed(0)
xx2 <- sapply(samplesize, rmultinom, n = 1, prob = p)
xx2
# [,1] [,2] [,3] [,4]
#[1,] 24 17 20 24
#[2,] 11 14 8 16
#[3,] 15 14 12 8
colSums(xx2)
#[1] 50 45 40 48
注意:rmultinom
与其他分布函数 不同 "vectorized"。
set.seed(0)
fail <- rmultinom(length(samplesize), samplesize, p)
# [,1] [,2] [,3] [,4]
#[1,] 24 19 25 24
#[2,] 11 16 10 17
#[3,] 15 15 15 9
colSums(fail)
#[1] 50 50 50 50
所以R级for
循环或sapply
循环或使用糖函数Vectorize
是必要的。
如果您愿意,可以使用 mapply
避免循环:
samplesize <- c(50, 45, 40, 48)
p <- c(0.4, 0.3, 0.3)
mapply(rmultinom, samplesize, MoreArgs = list(n=1, prob=p))
# [,1] [,2] [,3] [,4]
#[1,] 15 22 14 18
#[2,] 13 9 14 12
#[3,] 22 14 12 18
我想我也可以使用这种使用复制函数的方法来解决我的问题,不是吗?
r1= c(0.34,0.33,0.33)
rep=10
size=500
alpha=0.05
q=0.1
set.seed(1)
didnt_vote=rbinom(rep, size, q)
replicate(n=1,rmultinom(rep,didnt_vote,r1) )
我需要生成具有不同样本大小的多项式随机变量。
假设我已经生成了如下样本量,
samplesize =c(50,45,40,48)
然后我需要根据这个不同的样本量生成多项式随机变量。我尝试使用 for 循环并使用应用函数 (sapply)。
使用 For 循环,
p1=c(0.4,0.3,0.3)
for( i in 1:4)
{
xx1[i]=rmultinom(4, samplesize[i], p1)
}
如果我的代码是正确的,那么我应该得到一个有 4 列和 3 行的矩阵。其中列总计应等于样本大小中的每个值。但我不明白。
使用应用,
sapply( samplesize ,function(x)
{
rmultinom(10, samplesize[x], p1)
})
我在这里也遇到了错误。
所以谁能帮我弄清楚哪里出了问题?
谢谢
samplesize <- c(50, 45, 40, 48)
p <- c(0.4, 0.3, 0.3)
## method 1
set.seed(0)
xx1 <- matrix(0, length(p), length(samplesize))
for(i in 1:length(samplesize)) {
xx1[, i] <- rmultinom(1, samplesize[i], p)
}
xx1
# [,1] [,2] [,3] [,4]
#[1,] 24 17 20 24
#[2,] 11 14 8 16
#[3,] 15 14 12 8
colSums(xx1)
#[1] 50 45 40 48
## method 2
set.seed(0)
xx2 <- sapply(samplesize, rmultinom, n = 1, prob = p)
xx2
# [,1] [,2] [,3] [,4]
#[1,] 24 17 20 24
#[2,] 11 14 8 16
#[3,] 15 14 12 8
colSums(xx2)
#[1] 50 45 40 48
注意:rmultinom
与其他分布函数
set.seed(0)
fail <- rmultinom(length(samplesize), samplesize, p)
# [,1] [,2] [,3] [,4]
#[1,] 24 19 25 24
#[2,] 11 16 10 17
#[3,] 15 15 15 9
colSums(fail)
#[1] 50 50 50 50
所以R级for
循环或sapply
循环或使用糖函数Vectorize
是必要的。
如果您愿意,可以使用 mapply
避免循环:
samplesize <- c(50, 45, 40, 48)
p <- c(0.4, 0.3, 0.3)
mapply(rmultinom, samplesize, MoreArgs = list(n=1, prob=p))
# [,1] [,2] [,3] [,4]
#[1,] 15 22 14 18
#[2,] 13 9 14 12
#[3,] 22 14 12 18
我想我也可以使用这种使用复制函数的方法来解决我的问题,不是吗?
r1= c(0.34,0.33,0.33)
rep=10
size=500
alpha=0.05
q=0.1
set.seed(1)
didnt_vote=rbinom(rep, size, q)
replicate(n=1,rmultinom(rep,didnt_vote,r1) )