Извлечение Estimate и P-value из нескольких cor.test () приводит к R - PullRequest
0 голосов
/ 18 марта 2019

У меня есть книга Excel с 54 листами. Каждый лист представляет одну страну и представляет собой матрицу 17 x 11, где строки - это годы, а столбцы - экономические переменные.

Я могу перенести книгу Excel в R с помощью пакета readxl .

sheet_list <- lapply(1:54, function(i) read_excel("FDI-vs-variables.xlsx", sheet = i, na="NA"))

Мои данные теперь существуют в виде списка фреймов данных, sheet_list , где каждый фрейм данных представляет один лист моей рабочей книги.

Далее я хочу запустить корреляционный тест для двух переменных, которые мне нужны, на всех листах / фреймах данных.

Например, третий столбец во всех листах / рамках данных - это ВВП, а восьмой столбец - это процент недоедающего населения. Я могу написать функцию, которая захватывает эти соответствующие столбцы в листе / кадре данных и запускает корреляционный тест, используя эти данные.

dfCorTest <- function(df){
  rslt <- cor.test(df[[3]],df[[8]], method="kendall",use="pairwise")
  return(rslt)
}

Затем я использую lapply , чтобы применить эту функцию к каждому листу / фрейму данных в моем списке из 54 листов / фреймов данных.

cor_results <- lapply(sheet_list, dfCorTest)

В результате получается список списков cor_results с подробным описанием результатов 54 различных cor.test прогонов.

Как извлечь из этого списка списков только оценку корреляции (tau) и значение p?

Я знаю, что вы можете вызвать конкретные результаты cor.test , используя $estimate и $p.value, и я могу сделать это в списке cor_results следующим образом:

cor_results[[1]]$estimate
cor_results[[1]]$p.value
cor_results[[2]]$estimate
cor_results[[2]]$p.value
...and so on

Но как эффективно это сделать? В идеале я хотел бы иметь возможность записывать в текстовый файл, где вывод выглядит примерно так:

SheetNo    Estimate    P-value
1          3.33        0.054
2          -2.76       0.889
...        ...         ...
54         1.23        0.007

Я знаю, что подобный вопрос задавался в Как извлечь ... , но они использовали для циклов вместо lapply для запуска нескольких корреляционных тестов и я не могу понять, эквивалентный код.

ОБНОВЛЕНИЕ / РЕДАКТИРОВАНИЕ

Ответ, предложенный пользователем Parfait ниже работал (спасибо!). Исправление того, что было возвращено функцией и комбо из sapply и transpose :

dfCorTest <- function(df){
  rslt <- cor.test(df[[3]], df[[8]], method="kendall", use="pairwise")

  return(c(estimate = rslt$estimate,
           p.value = rslt$p.value))
}

cor_results <- t(sapply(sheet_list, dfCorTest))

1 Ответ

0 голосов
/ 18 марта 2019

Рассмотрите возможность использования sapply для матричного вывода (т. Е. s подразумеваемая версия) результатов корреляции с корректировкой возвращаемого объекта и транспонированием t() в конце:

dfCorTest <- function(df){
  rslt <- cor.test(df[[3]], df[[8]], method="kendall", use="pairwise")

  return(c(estimate = rslt$estimate,
           p.value = rslt$p.value))
}

cor_results <- t(sapply(sheet_list, dfCorTest))

Rextester Demo

...