我有一个三维数据集,其中维度是var,年份和日期。
在我的示例数据中,有:
基本上,每个变量每年在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转换为数字类,但我不确定这是正确的方法。
有人可以澄清我采取的步骤在哪里错了吗?我确信这很简单,但我看不到它。感谢您的帮助!
如果它是相关的 - 我最终试图确定年与变量之间的相关性。我试图确定是否存在高度相关性,如果有,那么我可以放弃几年。
答案 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