我正在运行一个模拟,该模拟采用以1列开头的矩阵中的值样本。然后我将它们放入选择标准,然后从矩阵中的每一行中随机选择输出中的值并保存该随机选择。出于某种原因,当我将sample()应用于具有实数和NA的行上的矩阵时,它返回一个甚至无法进行采样的数字。我可能在使用sample()函数时出错了,但我不明白这个未知值的来源。
示例代码:
theta <- c(30, 84, 159, 32, 60, 97)
omega <- 0.01
k <- 1
xn <- matrix(c(30, 84, 159, 32, 60, 97), ncol=1)
dup <- xn * 2
set.seed(1)
z <- matrix(rbinom(n=rep(1,length(dup)),size = as.vector(dup),prob = 0.5),nrow = nrow(dup))
z1 <- dup - z
xn <- cbind(z, z1) # put both in a matrix
W <- exp( -(1/2)*( ( ( xn - theta ) / theta ) ^2 / omega ) )
set.seed(1)
Z <- matrix(rbinom(nrow(W) * ncol(W), 1, W), nrow=nrow(W), ncol=ncol(W) )
xn <- ifelse ( Z == 0, 0, xn )
xn
[,1] [,2]
[1,] 32 0
[2,] 78 0
[3,] 144 0
[4,] 0 30
[5,] 60 60
[6,] 92 102
我不想包含任何0值,因此我将它们更改为NA,然后将sample()函数应用于每一行以返回单个值。
xn[which(xn==0)] <- NA
set.seed(1)
xn2 <- matrix(apply(xn, 1, function(x){sample(x[!is.na(x)], size = k)}), ncol = k)
我应该得到的是
xn
[,1]
[1,] 32
[2,] 78
[3,] 144
[4,] 30
[5,] 60
[6,] 102
但我得到的是:
xn
[,1]
[1,] 9
[2,] 30
[3,] 83
[4,] 24
[5,] 60
[6,] 102
具体来说,在这个例子中,值9,23,55和24是我所知道的。
当我拿这个样本时,有谁知道我犯了什么错误?
答案 0 :(得分:2)
总结评论,
?sample
说
如果x的长度为1,则为数字(在is.numeric意义上),x> = 1,则样本采样从1:x开始。
对于您的应用,当x
长度为1时,您真的只想使用x
而不是sample(x)
的值。您可以通过添加检查来调整代码,以便在传递x
之前查看sample
的长度是否大于1
matrix(apply(xn, 1, function(x){
if (length(x[!is.na(x)]) > 1) {
sample(x[!is.na(x)], size = k)
} else x[!is.na(x)]
}), ncol=k)
[,1]
[1,] 32
[2,] 78
[3,] 144
[4,] 30
[5,] 60
[6,] 102