Как я могу создать цикл или функцию для циклического перебора списка двух векторов, содержащих переменные, для запуска тестов KS для ответа - PullRequest
1 голос
/ 21 октября 2019

Для простоты я упростил и обобщил код вопроса.

Итак, моя проблема (R one is) заключается в том, что я пытаюсь циклически проходить ряд тестов ks.boot Колмогорова Смирнова для нескольких уровней по двум факторам. Мне нужно поднастроить данные для каждого уровня имен векторов df.test $ (например, W, X, Y и Z, представляющих названия видов), а затем циклически сравнивать распределения длин между каждым уровнем df.test $ TSM.FACT (например, A, B, C и т. д., представляющие периоды времени).

Таким образом, для каждого уровня в именах df.test $ (например, W, X, Y, Z) мне нужно будет сравнить распределения их длин в разные периоды времени A и B;затем A против C, затем B против C и сохраните каждый результат в кадре данных;запись, где проводилось сравнение.

#for ease create the data##
  df.fact <- data.frame("A"=abs(rnorm(1000, mean = 350, sd=160)),"B"= abs(rpois(n = 1000, lambda = 50)), "C"=abs(rnorm(1000, mean = 200, sd=80)), names=rep(factor(LETTERS[23:26]), 1000))
library(reshape2)
df.test<-melt(df.fact, id.vars = "names", value.name = "Length2")
names(df.test)[names(df.test) =="variable"] <- "TSM.FACT"
names(df.test)[names(df.test) =="value"] <- "length2"

dfX <-subset(df.test, names == c("X"))
A <-subset(dfX , TSM.FACT  == c("A"))
B <-subset(dfX , TSM.FACT  == c("B"))
C <-subset(dfX , TSM.FACT  == c("C"))
KS.XAB <- ks.boot(A$length2,B$length2, nboots=5000)
KS.XAC <- ks.boot(A$length2,C$length2, nboots=5000)
KS.XBC <- ks.boot(B$length2,C$length2, nboots=5000)
summary(KS.XAB)
summary(KS.XAC)
summary(KS.XBC)

dfY<-subset(df.test, names == c("Y"))
A <-subset(dfY , TSM.FACT  == c("A"))
B <-subset(dfY , TSM.FACT  == c("B"))
C <-subset(dfY , TSM.FACT  == c("C"))
KS.YAB <- ks.boot(A$length2,B$length2, nboots=5000)
KS.YAC <- ks.boot(A$length2,C$length2, nboots=5000)
KS.YBC <- ks.boot(B$length2,C$length2, nboots=5000)
summary(KS.YAB)
summary(KS.YAC)
summary(KS.YBC)
#AND REPEAT FOR Z#

1 Ответ

1 голос
/ 21 октября 2019

Готовя все шаблоны имен, TSM.FACT1, TSM.FACT2, вы можете легко выполнить все тесты с помощью циклических методов.

Вот мой пример:

library(tibble); library(tidyr); library(dplyr); library(purrr)

# preparing all pattern
comb_d <- df.test %>% 
  as_tibble() %>%       # conv to tibble
  group_by(names) %>% 
  summarize(TSM.FACT = list(unique(as.character(TSM.FACT)))) %>%   # get unique TSM.FACT as vector
  mutate(comb_ = map(TSM.FACT,
                     ~ {
                       .x %>%           # calculate all combination by combn()
                         combn(2) %>%   # output is row:2 x col:n matrix
                         t() %>% 
                         as_tibble()   # conv to row:n x col:2 tibble
                     })) %>% 
  dplyr::select(names, comb_) %>% 
  # unnest(names(.)) %>%   # for tidyr v1.0.0
  unnest() %>%             # for tidyr under v1.0.0
  set_names("names_", "TSM.FACT1", "TSM.FACT2") # chage colnames


# making data and do ks.test line by line
comb_d <- comb_d %>%               # I typo the below line, sorry.
  mutate(ks_res = pmap(list(names_, TSM.FACT1, TSM.FACT2),    # making data sets using 3rows
                       function(names_, TSM.FACT1, TSM.FACT2){

                         temp <- df.test %>% 
                           filter(names == names_)  # LIKE subset(df.test, names == c("X"))

                         d1 <- temp %>% 
                                  filter(TSM.FACT == TSM.FACT1) %>%   # LIKE subset(dfX , TSM.FACT  == c("A"))
                           pull(Length2)  # pull the col as vector

                         d2 <- temp %>% 
                           filter(TSM.FACT == TSM.FACT2) %>% 
                           pull(Length2)

                         Matching::ks.boot(d1, d2, nboots = 5000)  # do ks.boot

                       }))

# you can access the result such like
comb_d$ks_res[[1]] %>% 
  summary()
# or
comb_d %>% 
  filter(names == "X", TSM.FACT1 == "A", TSM.FACT2 == "B") %>% 
  pluck("ks_res")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...