如何在R中计算每个样本的R与P时间序列的趋势相关性?
计算每个样本的时间序列趋势相关性
Base R 实现
首先注意原数据中P列是P_T4,而需求是使用P_T3,先假设这是笔误,先修正列名(如果实际不需要修正,跳过这一步):
# 修正P列名(若原数据的P_T4是笔误) names(df)[names(df) == "P_T4"] <- "P_T3"
接下来用apply按行处理每个样本,提取R和P的时间序列向量并计算相关系数:
# 逐样本计算相关性 sample_correlations <- apply(df, 1, function(row) { r_seq <- c(row["R_T1"], row["R_T2"], row["R_T3"]) p_seq <- c(row["P_T1"], row["P_T2"], row["P_T3"]) cor(r_seq, p_seq) }) # 转换为易读的数据框 result <- data.frame( Sample = names(sample_correlations), Trend_Correlation = sample_correlations, row.names = NULL ) print(result)
Tidyverse 实现
如果偏好tidy风格的代码,可以先将宽表转换为长表,再分组计算:
library(tidyverse) # 修正列名(若需要) df <- df %>% rename(P_T3 = P_T4) # 宽表转长表,拆分变量与时间点 long_df <- df %>% rownames_to_column("Sample") %>% pivot_longer(-Sample, names_to = c("Var", "Time"), names_sep = "_") %>% filter(Time %in% c("T1", "T2", "T3")) # 分组计算每个样本的R与P序列相关性 result <- long_df %>% pivot_wider(names_from = Var, values_from = value) %>% group_by(Sample) %>% summarise(Trend_Correlation = cor(R, P)) %>% ungroup() print(result)
补充说明
- 上述代码默认计算皮尔逊相关系数,如果需要斯皮尔曼或肯德尔相关,只需在
cor()函数中添加method = "spearman"或method = "kendall" - 如果原数据中的
P_T4并非笔误,而是确实要使用P_T1、P_T2、P_T4作为P的时间序列,只需修改代码中提取P向量的列名即可
内容的提问来源于stack exchange,提问作者humanlee
相关产品推荐
相关产品推荐

