3个维度的相关性

时间:2017-08-23 09:20:25

标签: arrays r correlation

我有一个三维数据集,其中维度是var,年份和日期。

在我的示例数据中,有:

  • 5个日期,date1:​​date5
  • 5年,y1:y5
  • 和5个变量,TA_JDRng,TH_JDMax,TH_JDMaxMn,TH_JDMaxSD,TH_JDMaxVar

基本上,每个变量每年在5个特定日期记录。

data <- 
read.table(header = TRUE, 
           text = "date var y1  y2  y3  y4  y5
date1   TA_JDRng    123 80  80  80  80
date1   TH_JDMax    343 343 343 343 343
date1   TH_JDMaxMn  107.4286    107.4286    107.4286    114.1429    131.1429
date1   TH_JDMaxSD  161.2729    161.2729    161.2729    157.6234    93.4477
date1   TH_JDMaxVar 26008.9524  26008.9524  26008.9524  24845.1429  8732.4762
date2   TA_JDRng    123 80  80  80  80
date2   TH_JDMax    343 343 343 343 343
date2   TH_JDMaxMn  107.4286    107.4286    107.4286    114.1429    134.2857
date2   TH_JDMaxSD  161.2729    161.2729    161.2729    157.6234    92.0502
date2   TH_JDMaxVar 26008.9524  26008.9524  26008.9524  24845.1429  8473.2381
date3   TA_JDRng    123 80  80  80  80
date3   TH_JDMax    343 343 343 343 343
date3   TH_JDMaxMn  107.4286    107.4286    107.4286    114.1429    114.1429
date3   TH_JDMaxSD  161.2729    161.2729    161.2729    157.6234    157.6234
date3   TH_JDMaxVar 26008.9524  26008.9524  26008.9524  24845.1429  24845.1429
date4   TA_JDRng    77  99  56  56  56
date4   TH_JDMax    319 319 319 319 319
date4   TH_JDMaxMn  180.7143    180.7143    180.7143    180.7143    180.7143
date4   TH_JDMaxSD  162.8903    162.8903    162.8903    162.8903    162.8903
date4   TH_JDMaxVar 26533.2381  26533.2381  26533.2381  26533.2381  26533.2381
date5   TA_JDRng    177 77  99  56  56
date5   TH_JDMax    65  319 319 319 319
date5   TH_JDMaxMn  59.2857 180.7143    180.7143    180.7143    180.7143
date5   TH_JDMaxSD  13.901  162.8903    162.8903    162.8903    162.8903
date5   TH_JDMaxVar 193.2381    26533.2381  26533.2381  26533.2381  26533.2381")

此时事情变得有些不稳定。我知道我需要将其转换为数组,并且我已经找到了适当的方法来实现这一目标。

dataArray <- simplify2array(by(data, data$XorYorZ, as.matrix))

首先,我不清楚是否应该按日期或年份分割(data$XorYorZ),或者是否无关紧要。

dataArray <- simplify2array(by(data, data$date, as.matrix))
dim(dataArray)

我并不是100%确信这看起来是正确的,因为我们仍保留date和var的列。我知道他们不会像魔术一样消失,我只是不知道是否a)需要解决,如果是,那么b)如何做到这一点。

同样,我知道如何计算相关矩阵,但此时这不起作用。

corM <- apply(dataArray, 1:2, cor.test, unique(data$date)) Error in cor.test.default(newX[, i], ...) : 'x' must be a numeric vector

我相信我理解错误的原因,即文本仍然在数组中,但我不知道如何解决这个问题。我确实考虑过将date和var转换为数字类,但我不确定这是正确的方法。

有人可以澄清我采取的步骤在哪里错了吗?我确信这很简单,但我看不到它。感谢您的帮助!

如果它是相关的 - 我最终试图确定年与变量之间的相关性。我试图确定是否存在高度相关性,如果有,那么我可以放弃几年。

2 个答案:

答案 0 :(得分:0)

您只能对配对样本使用cor.test。编辑:您不能使用矩阵中的所有数值数据。只有你可以通过cor.mat(data$y1, data$y2)来做例如year1和year2之间的相关性。但我想这不是你想要的。

您的数据结构不同,您有一个连续的因变量和3(in)因变量。然后,您将必须应用多元线性回归并对变量进行分解。看看here

此外,您的变量“date”和“year”可能是相关的。在这种情况下,我会考虑将它们转换为1个时间变量并执行specific regression for time-series data

答案 1 :(得分:0)

感谢您的帮助,特别感谢@flyingfille明确指出数据不是成对的。我继续寻找我的问题,并且有可用的选项来计算这些维度的相关性。然而,事实证明,在这种情况下,这不是必需的。

正如在我的问题结束时所说的那样,我试图关注年与变量之间的关系,难度是每年/ var有多个样本日期。

我采取了分别查看每个变量并计算每个变量的协方差矩阵的方法。方法如下:

pacman::p_load(dplyr)

#First I split the data and take note of the names of the variables
dataSplit <- data %>% gather(year, value, -date, -var) %>% split(., .$var)
varNames <- names(dataSplit)

lapply(1:length(dataSplit), function(x) { 
#Data is converted to a [year,date] matrix
  dataMat <- dataSplit[[x]] %>% spread(year, value) %>% select(-var, -date) %>% as.matrix

#Correlation matrix for the matrix is calculated      
  dataCor <- round(cor(dataMat), digits = 2)

#The correlation matrix is flattened (using the function below) to simplify analysis of the results across the many variables.
  flattenCorrMatrix(dataCor) %>% unclass %>% as_data_frame %>% mutate(var = varNames[x]) %>% select(var, everything())
}) %>% bind_rows


flattenCorrMatrix <- function(cormat) {
  ut <- upper.tri(cormat)
  data.frame(
    row = rownames(cormat)[row(cormat)[ut]],
    column = rownames(cormat)[col(cormat)[ut]],
    cor  =(cormat)[ut]
  )
}

尽管没有以传统的相关矩阵格式输出相关性,但这已经达到了预期的结果,澄清了哪些年份具有相当大的相关性并且可以被删除。

# A tibble: 50 x 4
        var    row column   cor
      <chr> <fctr> <fctr> <dbl>
 1 TA_JDRng     y1     y2 -0.84
 2 TA_JDRng     y1     y3  0.99
 3 TA_JDRng     y2     y3 -0.91
 4 TA_JDRng     y1     y4 -0.06
 5 TA_JDRng     y2     y4 -0.49
 6 TA_JDRng     y3     y4  0.09
 7 TA_JDRng     y1     y5 -0.06
 8 TA_JDRng     y2     y5 -0.49
 9 TA_JDRng     y3     y5  0.09
10 TA_JDRng     y4     y5  1.00
# ... with 40 more rows