簡體   English   中英

有沒有辦法在不使用 R 中的 sample() 函數的情況下創建向量的排列?

[英]Is there a way to create a permutation of a vector without using the sample() function in R?

我希望你有一個美好的一天。 我想知道是否有辦法在 R 中的向量中創建值的排列(重新排列)?

我的教授提供了一份作業,其中我們應該為隨機化測試創建函數,一個使用 sample() 創建排列,另一個不使用 sample() 函數。 到目前為止,我的所有努力都沒有結果,因為我能找到的任何答案總是求助於使用 sample() 函數。 我嘗試了其他幾種方法,例如使用 runif() 建立索引和編寫自己的函數,但都無濟於事。 唉,我接受了失敗,來到這里尋求救贖。

使用 sample() 函數時,代碼如下所示:

#create the groups
a <- c(2,5,5,6,6,7,8,9)
b <- c(1,1,2,3,3,4,5,7,7,8)

#create a permutation of the combined vector without replacement using the sample function()
permsample <-sample(c(a,b),replace=FALSE)

permsample
[1] 2 5 6 1 7 7 3 8 6 3 5 9 2 7 4 8 1 5

而且,作為參考,我的函數的整個代碼如下所示:

PermutationTtest <- function(a, b, P){
  sample.t.value <- t.test(a, b)$statistic
  perm.t.values<-matrix(rep(0,P),P,1)
  N <-length(a)
  M <-length(b)
  for (i in 1:P)
  {
    permsample <-sample(c(a,b),replace=FALSE)
    pgroup1 <- permsample[1:N]
    pgroup2 <- permsample[(N+1) : (N+M)]
    perm.t.values[i]<-  t.test(pgroup1, pgroup2)$statistic
  }
  return(mean(perm.t.values))
}

我如何實現同樣的事情,但不使用 sample() 函數並且在基礎 R 的范圍內? 我的教授給出的唯一提示是“使用索引”。 非常感謝您的幫助,祝您度過愉快的一天。

您可以使用runif()生成介於 1.0 和最終數組長度之間的值。 floor()函數返回該數字的整數部分。 在每次迭代中,我減小要選擇的隨機數的范圍,將原始數組的第rn位置的元素附加到新數組並將其刪除。

a <- c(2,5,5,6,6,7,8,9)
b <- c(1,1,2,3,3,4,5,7,7,8)

c<-c(a,b)

index<-length(c)
perm<-c()

for(i in 1:length(c)){
  rn = floor(runif(1, min=1, max=index))
  perm<-append(perm,c[rn])
  c=c[-rn]
  index=index-1
}


如果我們使用連續的數字,更容易看出發生了什么:

a <- 1:8
b <- 9:17
ab <- c(a, b)
ab
# [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17

現在繪制 17 個 ( length(ab) ) 隨機數並使用它們對ab進行排序:

rnd <- runif(length(ab))
ab[order(rnd)]
#  [1]  5 13 11 12  6  1 17  3 10  2  8 16  7  4  9 15 14
rnd <- runif(length(ab))
ab[order(rnd)]
#  [1] 14 11  5 15 10  7 13  9 17  8  2  6  1  4 16 12  3

對於每個排列,只需再繪制 17 個隨機數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM