Макрос рандомизации - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь измерить сигнал phylogeneti c в двух переменных, дискретной и непрерывной. Для этого я использую δ-statisti c (Borges et al, 2018) и K-statisti c (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, я думаю, это немного отличается, поскольку это больше не вектор, а таблица с двумя столбцами (виды, значения):

%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)

Et c.

Я думал об этом, но может у кого-то есть другая идея. В любом случае, я в игре.

Надеюсь, я ясно дал понять.

РЕДАКТИРОВАТЬ: Спасибо за ваши ответы. Да, al oop - это именно то, что мне нужно. И да, запись всех значений в один вектор кажется более подходящим, я согласен с вами.

С δ-statisti c сигнал phylogeneti c тем более важен в данных, как δ в приоритете. Но что такое кайф? Вот почему я хочу сделать 1000 итераций, чтобы вычислить p-значение и продемонстрировать, является ли исходное значение «исключительным» или нет. То же самое с K, который находится между 0 и 1 в присутствии сигнала phylogeneti c.

Вот более явный пример:

> 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))

1 Ответ

0 голосов
/ 06 мая 2020

Я все еще не уверен, что именно вы делаете, но, надеюсь, это указывает вам правильное направление:

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 are, я их просто использовал из вашего кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...