随机宏
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)
这是未经测试的,因为我不知道 vector
或 path
是什么,我只是从您的代码中使用它们
我尝试测量两个变量的系统发育信号,一个是离散变量,一个是连续变量。为此,我分别使用了 δ 统计量 (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)
这是未经测试的,因为我不知道 vector
或 path
是什么,我只是从您的代码中使用它们