Создание n новых наборов данных путем случайной выборки существующих данных, а затем применение функции к новым наборам данных - PullRequest
1 голос
/ 28 октября 2019

Для статьи, которую я пишу, я разделил больший набор данных на 3 группы, потому что я думал, что сила корреляции между 2 переменными в этих группах будет отличаться (они сделали). Я хочу посмотреть, повлияет ли подмножество моих данных на случайные группы также на силу корреляций (т. Е. Является ли то, что я вижу, просто эффектом поднабора, или эти группы действительно значимы).

С этой целью я пытаюсь сгенерировать n новых фреймов данных путем случайной выборки 150 строк из существующего набора данных, а затем хочу вычислить коэффициенты корреляции для двух переменных в этих n новые кадры данных, сохраняя коэффициент корреляции и значимость в новом файле.

Но, КАК?

Я могу сделать это вручную, например, с помощью dplyr, что-то вроде

newdata <- sample_n(Random_sample_data, 150)
output <- cor.test(newdata$x, newdata$y, method="kendall")

Я бы, очевидно, не хотел набирать это 1000 или100000 раз, и пытались что-то делать с циклами и лапы (см. Ниже), но они не работали (несомненно, из-за чего-то действительно очевидного, что я скучаю!).

Здесь я попытался присвоить каждой строке отдельную группу из 10 групп, а затем провести корреляции между x и y по следующим группам:

Random_sample_data<-select(Range_corrected, x, y)
cat <- sample(1:10, 1229, replace=TRUE)
Random_sample_cats<-cbind(Random_sample_data,cat)

correlation <- function(c) {
  c <- cor.test(x,y, method="kendall")
  return(c)
}
b<- daply(Random_sample_cats, .(cat), correlation)

Сообщение об ошибке:

Error in cor.test(x, y, method = "kendall") : 
      object 'x' not found

1 Ответ

0 голосов
/ 28 октября 2019

Когда у вас есть код для того, что вы хотите сделать один раз, вы можете поместить его в replicate, чтобы сделать это n раз. Вот воспроизводимый пример для встроенных данных

result = replicate(n = 10, expr = {
  newdata <- sample_n(mtcars, 10)
  output <- cor.test(newdata$wt, newdata$qsec, method="kendall")
})

replicate сохранит результат последней строки того, что вы сделали (output <- ...) для каждой репликации. Он попытается упростить результат, в этом случае cor.test возвращает список длиной 8, поэтому репликация упростит результаты до матрицы с 8 строками и 10 столбцами (1 столбец на репликацию).

You может хочет немного очистить результаты, чтобы, например, вы сохранили только значение p. Здесь мы храним только p-значение, поэтому результатом является вектор с одним p-значением на репликацию, а не матрица:

result = replicate(n = 10, expr = {
  newdata <- sample_n(mtcars, 10)
  cor.test(newdata$wt, newdata$qsec, method="kendall")$p.value
})
...