随机宏

Randomization macro

我尝试测量两个变量的系统发育信号,一个是离散变量,一个是连续变量。为此,我分别使用了 δ 统计量 (Borges et al 2018) 和 K 统计量 (Blomberg 2003)。我有一棵树和两个对应于我的变量的向量。这两个统计的代码行如下:

1) delta(vector, tree, lambda0, se, sim, thin, burn)

2) phylosig(tree, vector, method = "K")

我每次都得到一个值。但我想随机化我的向量来测试原始值的重要性。我想重复 1000 次,然后进行简单的显着性测试,但由于我是 R 的新用户,我不知道该怎么做。我想到了这样的事情:

对于δ:

%first repetition
random_vector <- sample(vector)
random_delta <- delta(vector, tree, lambda0, se, sim, thin, burn)
write.xlsx(random_delta, path)

%second repetition
random_vector <- sample(random_vector)
random_delta <- delta(vector, tree, lambda0, se, sim, thin, burn)
write.xlsx(random_delta, path, append = TRUE)

一直,一直,直到 1000 个 δ 统计数据存储在一个 .xlsx 中,准备好在测试中使用。

对于 K,我想它有点不同,因为它不再是向量,而是具有两列(物种,值)的 table:

%first repetition
random_vector <- sample(vector)
names(random_vector) <- tree$tip.label
random_K <- phylosig(tree, vector, method = "K")
write.xlsx(random_K, path)

%second rep
random_vector <- sample(random_vector)
names(random_vector) <- tree$tip.label
random_K <- phylosig(tree, vector, method = "K")
write.xlsx(random_delta, path, append = TRUE)

等等

我想到了,但也许有人有其他想法。不管怎样,我都在。

我希望我已经说清楚了。

编辑: 谢谢您的回答。是的,循环正是我所需要的。是的,将所有值写在一个向量中似乎更合适,我同意你的看法。

使用 δ 统计量,系统发育信号在数据中更为重要,因为 δ 较高。但什么是高呢?这就是为什么我想进行 1000 次迭代,以计算 p 值并演示原始值是否为 'exceptional'。与 K 相同,在存在系统发育信号的情况下,K 介于 0 和 1 之间。

这里有一个更明确的例子:

> library(phytools)
> trait_delta <- c(2,1,3,1,1,3,1,3,2,1,1,2,2,2,2,1,1,3,1,1)
> trait_K <- c(2,1,3,1,1,3,1,3,2,1,1,2,2,2,2,1,1,3,1,1)
> set.seed(25)
> ns <- 20
> tree <- rtree(ns)
> plot(tree)
> 
> #delta
> lambda0 <- 0.1
> se <- 0.5
> sim <- 10000
> thin <- 10
> burn <- 100
> 
> delta <- delta(trait_delta,tree,lambda0,se,sim,thin,burn)
> rand_values_delta <- c(print(delta))
>
> #to loop 999 times
> rand_trait_delta <- sample(trait_delta)
> rand_delta <- delta(rand_trait_delta,tree,lambda0,se,sim,thin,burn)
> rand_values_delta <- append(rand_values_delta, print(rand_delta), after =
> length(rand_values_delta+1))
> 
>
> #K
> names(trait_K) <- tree$tip.label
> K <- phylosig(tree, trait_K, method = "K")
> rand_values_K <- c(K)
>
> #to loop 999 times
> rand_trait_K <- sample(trait_K)
> names(rand_trait_K) <- tree$tip.label
> rand_K <- phylosig(tree, rand_trait_K, method = "K")
> rand_values_K <- append(rand_values_K, rand_K, after =
> length(rand_values_K+1))

我对你在做什么仍然有点模糊,但希望这能为你指明正确的方向:

n <- 10000            # run this many iterations 
results <- rep(NA, n) # create an empty vector to store all the values

for (i in 1:n){

  # get the random vector for this iteration
  random_vector <- sample(vector) 

  # save the value you output
  results[i] <- delta(vector, tree, lambda0, se, sim, thin, burn) 

}

# write the single vector to file
write.xlsx(results, path)

这是未经测试的,因为我不知道 vectorpath 是什么,我只是从您的代码中使用它们