三维相关性

3
我有一个三维数据集,其中的维度是变量、年份和日期。
在我的示例数据中,有:
- 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)

我并不完全认为这看起来正确,因为我们仍然保留了日期和变量的列。我知道它们不会像魔术一样消失,但我不知道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

我相信我理解错误的原因是文本仍然存在于数组中,但我不知道该如何解决。我考虑将日期和变量转换为数字类别,但我不确定这是否是正确的方法。

有人能否澄清一下我的步骤错在哪里?我相信这是一些简单的问题,但我只是看不到它。提前感谢您的帮助!

如果相关 - 我最终试图确定年份和变量之间的相关性。我试图确定是否存在高度相关性,如果是,则可以放弃一些年份。


1
尝试使用simplify2array(by(data[, 3:7], list(data$date, data$var), as.matrix))进行简化。您不需要拆分整个数据集,因为整个数据集包含日期和变量的名称。我的理解是您只需要数值数据,因此将其作为by命令的第一个参数进行选择。 - coffeinjunky
谢谢@coffeinjunky,这解决了部分问题!您能解释一下为什么要同时按日期和变量拆分吗?我以为只需要按一个拆分。谢谢。 - Quinn
1
我只是为了阐述而写了 list(date, var),没有其他特别的原因。如果那让你感到困惑,我很抱歉。主要的问题是,应该避免将包含字符的数据框转换成矩阵,因为这样会导致所有变量都被转换成字符型。 - coffeinjunky
2个回答

0

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

你的数据结构不同,你有一个连续的因变量和3个(自变量)。那么你将需要应用多元线性回归并因式分解你的变量。请参考这里

此外,你的变量“date”和“year”可能存在相关性。在这种情况下,我建议将它们转换为1个时间变量,并执行特定于时间序列数据的回归分析


感谢 @flyingfille。感谢您指出成对问题,这让我的互联网搜索变得更简单了。我仍然看到了在多个维度上存在相关性的方法,但在这种情况下,这似乎不实用或不可取。多模型推断将是接下来的阶段,因此不幸的是回归不是解决方案!我只需要减少所需数据的年数(如果存在相关性),以简化未来的建模过程。但是,我现在已经找到了解决这个问题的方法。我感谢您的帮助。 - Quinn

0

感谢帮助,特别感谢 @flyingfille明确指出数据不是成对的。在我的问题得到解答后,我继续寻找,在这些维度上计算相关性的选项。然而,事实证明,在这种情况下这并不必要。

正如我在问题结尾所述,我试图关注年份和变量之间的关系,难点在于每个年份/变量都有多个样本日期。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接