Я выполняю cor.test для набора данных в цикле for, но я не знаю, как извлечь такую ​​информацию, как оценка и тау, из моего теста.

Перед выполнением цикла for в наборе данных функция cor.test () возвращает следующее:

cor.test(armpit$Corynebacterium.1, armpit$Staphylococcus.1, alterantive="two-sided", method="kendall", exact=FALSE, continuity=TRUE)

вернуть результат

Вот мой код для выполнения цикла. Теперь я хочу извлечь из своего теста оценку и тау.

for (i in 1:8) {
  for (j in 1:8) {
    if (j != i)
    cor.test( as.numeric(unlist(armpit[i])),
        as.numeric(unlist(armpit[j])), alterantive="two-sided",
        method="kendall", exact=FALSE, continuity=TRUE)
   }
}

Я проверял аналогичный вопрос от

аналогичный вопрос

Затем я меняю свой код на:

estimates = numeric(50)
pvalues = numeric(50)
for (i in 1:8) {
  for (j in 1:8) {
    if (j != i)
    cor.test( as.numeric(unlist(armpit[i])),
        as.numeric(unlist(armpit[j])), alterantive="two-sided",
         method="kendall", exact=FALSE, continuity=TRUE)
    estimates[i] = cor.test$estimate
    pvalues[i]= cor.test$p-value
   }
   }

Но возвращается:

Error in cor.test$estimate : object of type 'closure' is not subsettable

Может ли кто-нибудь предложить мне некоторую помощь о том, как извлечь оценку и значение tau из функции cor.test () в цикле for? Заранее спасибо.

2
statistics_learning 26 Дек 2015 в 16:03

2 ответа

Лучший ответ

Хорошо, нашел, надо было видеть раньше. Оператор if (j != i) должен заключать в скобки все, что должно быть сделано, если утверждение истинно. С конкретным форматированием, которое у вас было, R не разбирал его правильно. Мне не удалось получить ваши данные, поэтому я сделал некоторые (которые будут проверять случайные строки на случайные столбцы). Это работает:

M <- matrix(rnorm(8*8), ncol = 8) # made up test data
estimates = numeric(50)
pvalues = numeric(50)
for (i in 1:8) {
  for (j in 1:8) {
    if (j != i) { # need this bracket
        cor_test <-  cor.test(M[i,], M[,j],
             alternative="two.sided",
              method="kendall", exact=FALSE, continuity=TRUE)
        estimates[i] = cor_test$estimate
        pvalues[i]= cor_test$p.value
        } # and this bracket
    }
    }
estimates
pvalues

EDIT: альтернативная версия для хранения всех результатов во фрейме данных.

M <- matrix(rnorm(8*8), ncol = 8) # made up test data

ans <- data.frame(i = rep(NA, 64), j = rep(NA, 64), estimate = rep(NA, 64), pvalue = rep(NA, 64))
cnt <- 1
for (i in 1:8) {
  for (j in 1:8) {
    if (j != i) {
        cor_test <-  cor.test(M[i,], M[,j], alternative="two.sided", method="kendall", exact=FALSE, continuity=TRUE)
        ans[cnt,1] <- i
        ans[cnt,2] <- j
        ans[cnt,3] <- cor_test$estimate
        ans[cnt,4] <- cor_test$p.value
        cnt <- cnt + 1
        }
    }
    }

ans <- na.omit(ans)
1
Bryan Hanson 26 Дек 2015 в 22:44

cor.test возвращает список. Вы можете создать объект для захвата этого списка:

cor_test <- cor.test( as.numeric(unlist(armpit[i])), as.numeric(unlist(armpit[j])), alterantive="two-sided", method="kendall", exact=FALSE, continuity=TRUE)

Затем используйте cor_test и $ для доступа к каждому элементу списка:

estimates[i] = cor_test$estimate  
pvalues[i]= cor_test$p.value  # note the ., not the -

Исходная ошибка довольно загадочна, поэтому понятно, что вы были сбиты с толку. Вы написали cor.test$estimate, который запрашивает у R доступ к компоненту estimate функции cor.test , а не к результату теста.

estimates = numeric(50)
pvalues = numeric(50)
for (i in 1:8) {
  for (j in 1:8) {
    if (j != i)
    cor_test <- 
      cor.test( as.numeric(unlist(armpit[i])),
        as.numeric(unlist(armpit[j])), alterantive="two-sided",
         method="kendall", exact=FALSE, continuity=TRUE)
    estimates[i] = cor_test$estimate
    pvalues[i]= cor_test$p.value
   }
 }
3
Hugh 26 Дек 2015 в 13:37