2012-06-28 33 views
0

我正在運行一個模擬,它以1列開始的矩陣取值。然後我通過選擇標準,然後從矩陣的每一行中,它隨機從輸出中選擇一個值,並保存隨機選擇。由於某些原因,當我將sample()應用於具有實數和NA的行上的矩陣時,它會返回一個甚至無法採樣的數字。我可能做了一些錯誤的sample()函數,但我不明白這個未知值來自哪裏。R:在應用中使用示例函數的奇怪結果

示例代碼:

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 

我不想讓我將其更改爲NA,然後應用樣品()函數到每個行到返回一個值以包括任何0值。

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

哎呀之前大於1,增加他們在那裏 – Kevin

+1

我覺得你只是想避免使用'sample'時只有1件物品。這似乎給了你後面的內容:矩陣(應用(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)' – GSee

+0

這種行爲在文檔中有明確說明; '?sample':「如果x的長度爲1,是數字(在is.numeric的意義上)且x> = 1,則通過樣本的採樣從1:x開始。 –

回答

2

總結註釋,

?sample

如果x具有長度1,是數字(在is.numeric的意義上),並通過樣本x> = 1,從取樣發生1:X。

爲您的應用,當x的長度爲1的,你真的只是想用的x代替sample(x)值。您可以通過添加校驗適應你的代碼,看是否x長度將其通過sample

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