基于存在-缺失矩阵用R计算物种对的C score(CS)
问题描述
我有一份存在-缺失数据集,需要为每一对物种(BABO、BW、RC、SKS、MANG)计算**C score(CS)**以衡量物种共现情况。C score公式相关参数定义:
- ki:物种i的出现次数
- kj:物种j的出现次数
- K:两个物种的共同出现次数
我参考了相关文章,但未找到在R中实现的高效方法,尝试编写函数也未成功。以下是我的数据集:
data <- structure(list(group_id = c("2008-2-11.C3_900", "2008-2-11.C3_960", "2008-2-11.C3_1200", "2008-2-11.C3_1230", "2008-2-11.C3_1460", "2008-2-11.C3_1490", "2008-2-22.Mwani_0", "2008-2-22.Mwani_110", "2008-2-22.Mwani_600", "2008-2-22.Mwani_1650", "2008-2-20.Sanje_150", "2008-2-20.Sanje_410", "2008-2-20.Sanje_3000", "2008-5-9.C3_900", "2008-5-13.Mwani_750", "2008-5-13.Mwani_800", "2008-5-13.Mwani_900", "2008-5-13.Mwani_1080", "2008-5-13.Mwani_1800", "2008-5-13.Mwani_2200", "2008-5-13.Mwani_2900"), BABO = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0), BW = c(1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1), RC = c(0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0), SKS = c(0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0), MANG = c(0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)), row.names = c(NA, -21L), class = c("tbl_df", "tbl", "data.frame"))
数据集预览:
| group_id | BABO | BW | RC | SKS | MANG |
|---|---|---|---|---|---|
| 2008-2-11.C3_900 | 0 | 1 | 0 | 0 | 0 |
| 2008-2-11.C3_960 | 0 | 1 | 0 | 1 | 0 |
| 2008-2-11.C3_1200 | 0 | 1 | 1 | 1 | 0 |
| 2008-2-11.C3_1230 | 0 | 1 | 1 | 0 | 0 |
| 2008-2-11.C3_1460 | 0 | 0 | 1 | 0 | 0 |
| 2008-2-11.C3_1490 | 0 | 0 | 0 | 1 | 0 |
| 2008-2-22.Mwani_0 | 0 | 0 | 0 | 1 | 1 |
| 2008-2-22.Mwani_110 | 0 | 0 | 1 | 0 | 1 |
| 2008-2-22.Mwani_600 | 0 | 1 | 0 | 0 | 0 |
| 2008-2-22.Mwani_1650 | 0 | 0 | 0 | 1 | 0 |
| 2008-2-20.Sanje_150 | 0 | 1 | 0 | 1 | 0 |
| 2008-2-20.Sanje_410 | 0 | 0 | 1 | 0 | 0 |
| 2008-2-20.Sanje_3000 | 0 | 0 | 1 | 0 | 0 |
| 2008-5-9.C3_900 | 0 | 0 | 0 | 1 | 0 |
| 2008-5-13.Mwani_750 | 0 | 0 | 0 | 1 | 0 |
| 2008-5-13.Mwani_800 | 1 | 0 | 1 | 0 | 0 |
| 2008-5-13.Mwani_900 | 0 | 0 | 1 | 0 | 0 |
| 2008-5-13.Mwani_1080 | 0 | 1 | 1 | 0 | 0 |
| 2008-5-13.Mwani_1800 | 0 | 1 | 0 | 0 | 0 |
| 2008-5-13.Mwani_2200 | 0 | 1 | 0 | 0 | 0 |
| 2008-5-13.Mwani_2900 | 0 | 1 | 0 | 0 | 1 |
解决方案
以下是在R中高效计算所有物种对C score的方法:
步骤1:提取物种数据并计算出现次数
分离物种列,统计每个物种的总出现次数:
# 提取物种列(排除group_id) species_data <- data[, -1] # 计算每个物种的出现次数 occurrences <- colSums(species_data)
步骤2:计算物种间的共同出现次数
通过矩阵乘法快速生成所有物种对的共现次数矩阵:
# 计算共现矩阵:行×列的矩阵乘法得到每对物种的共同出现次数 co_occurrence <- t(species_data) %*% species_data
步骤3:批量计算所有物种对的C score
使用combn生成所有物种对,结合向量化操作计算C score(标准公式包含除以采样单元数-1,若不需要可移除分母):
# 生成所有物种对组合 species_pairs <- combn(colnames(species_data), 2) # 批量计算C score c_scores <- apply(species_pairs, 2, function(pair) { sp1 <- pair[1] sp2 <- pair[2] ki <- occurrences[sp1] kj <- occurrences[sp2] K <- co_occurrence[sp1, sp2] # 标准C score公式 (ki - K) * (kj - K) / (nrow(species_data) - 1) }) # 构建结果数据框 c_scores_df <- data.frame( Species1 = species_pairs[1, ], Species2 = species_pairs[2, ], C_score = round(c_scores, 6) )
查看结果
运行代码后,c_scores_df将包含所有物种对的C score:
print(c_scores_df)
示例输出:
Species1 Species2 C_score 1 BABO BW 0.002439 2 BABO RC 0.012195 3 BABO SKS 0.000000 4 BABO MANG 0.000000 5 BW RC 0.109756 6 BW SKS 0.080488 7 BW MANG 0.024390 8 RC SKS 0.097561 9 RC MANG 0.012195 10 SKS MANG 0.012195
内容的提问来源于stack exchange,提问作者Marnee Roundtree
相关产品推荐
相关产品推荐

