извлечение значения p теста cor для разделения данных - PullRequest
0 голосов
/ 13 июня 2018

Я учусь на R и мне нужна помощь в извлечении p-значения cor-теста с использованием разделенных данных.

Пример фрейма данных:

Periods     Factor 1    Factor 2
10/31/2007  76      215
10/31/2007  366     384
10/31/2007  194     186
10/31/2007  234     266
10/31/2007  365     236
9/31/2007   400     347
9/31/2007   116     197
9/31/2007   249     275
9/31/2007   132     177
9/31/2007   211     253
8/31/2007   276     67
8/31/2007   224     362
8/31/2007   161     27
8/31/2007   124     263

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

IC_cor_test <- function(x1,x2){
  corr <- cor.test(x1, x2, use='complete.obs', method = 'spearman',conf.level = 0.95,exact=FALSE)
  pvalue = corr$p.value
  cor_coef = corr$estimate
  return (c(cor_coef,pvalue))
}

данные разделения - для вычисления коэффициента корреляции двух факторов в каждом месяце

dates <- as.Date(Periods)
r <- ddply(df, "dates", function(IC_cor_test) {
  cor(IC_cor_test$ranked_factor1,IC_cor_test$ranked_factor2)
})

Результат - он напечатал коэффициент корреляции, но мне нужносоответствующее значение p также в следующем столбце.

     dates            V1
1   2007-10-31  0.2883066006
2   2007-11-30  0.0216892076
3   2007-12-31 -0.0697973283
4   2008-01-31  0.0343008730
5   2008-02-29  0.0333372672
6   2008-03-31  0.0007681072
7   2008-04-30  0.1196884915
8   2008-05-30  0.2301050604
9   2008-06-30 -0.0248823873

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

Это то, что вы ищете?(Примечание: измененные имена переменных bc error при импорте, которые мне было лень исправлять; столбцы были Periods, затем Factor, затем X1, поэтому сопоставьте их с вашими тремя столбцами):

library(magrittr)
library(dplyr)

> df %>% select(Periods,Factor,X1) %>%
         group_by(Periods) %>% 
         mutate(correl = cor.test(unlist(Factor), unlist(X1))$estimate,
         p_value = cor.test(unlist(Factor), unlist(X1))$p.value) %>% 
         select(Periods,correl,p_value) %>% distinct()
# A tibble: 3 x 3
# Groups:   Periods [3]
  Periods    correl p_value
  <fct>       <dbl>   <dbl>
1 10/31/2007  0.624 0.261  
2 9/31/2007   0.980 0.00338
3 8/31/2007  -0.142 0.858  
0 голосов
/ 13 июня 2018

То, как вы ввели функцию в ddply, было неверным синтаксисом.Вы вводили значение cor() в недопустимую функцию, а не вызывали функцию, созданную ранее.

Я исправил это здесь и немного подправил определение функции.

IC_cor_test <- function(x){
  x1 <- x$Factor1
  x2 <- x$Factor2
  corr <- cor.test(x1, x2, use='complete.obs', method = 'spearman',conf.level = 0.95,exact=FALSE)
  pvalue = corr$p.value
  cor_coef = corr$estimate
  return(data.frame(cor_coef=cor_coef,pvalue=pvalue))
}

r <-  ddply(df, "dates", IC_cor_test)
      dates cor_coef     pvalue
 2007-08-31      0.0 1.00000000
 2007-09-30      0.9 0.03738607
 2007-10-31      0.8 0.10408804

Кроме того, 31.09.07 не является реальной датой, поэтому данные примера не могли использоваться напрямую, но я изменил их на 30.09.07 и загрузил ваш пример следующим образом:

df <- read.table(text="Periods     Factor1    Factor2
                      '10/31/2007'  76      215
                      '10/31/2007'  366     384
                      '10/31/2007'  194     186
                      '10/31/2007'  234     266
                      '10/31/2007'  365     236
                      '9/30/2007'   400     347
                      '9/30/2007'   116     197
                      '9/30/2007'   249     275
                      '9/30/2007'   132     177
                      '9/30/2007'   211     253
                      '8/31/2007'   276     67
                      '8/31/2007'   224     362
                      '8/31/2007'   161     27
                      '8/31/2007'   124     263
",header=T)
0 голосов
/ 13 июня 2018

Вы на самом деле не вызываете свою пользовательскую функцию в своем коде.Вместо этого вы используете имя своей функции в качестве временной переменной при вызове обычной функции cor.

То, что вы хотите сделать, это использовать переменную, такую ​​как x, которая задает каждое подмножество кадра данных, а затем вызывать вашу пользовательскую функцию для данных следующим образом:

dates <- as.Date(Periods)
r <- ddply(df, "dates", function(x) {
  IC_cor_test(x$ranked_factor1,x$ranked_factor2)
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...