You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于存在-缺失矩阵用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_idBABOBWRCSKSMANG
2008-2-11.C3_90001000
2008-2-11.C3_96001010
2008-2-11.C3_120001110
2008-2-11.C3_123001100
2008-2-11.C3_146000100
2008-2-11.C3_149000010
2008-2-22.Mwani_000011
2008-2-22.Mwani_11000101
2008-2-22.Mwani_60001000
2008-2-22.Mwani_165000010
2008-2-20.Sanje_15001010
2008-2-20.Sanje_41000100
2008-2-20.Sanje_300000100
2008-5-9.C3_90000010
2008-5-13.Mwani_75000010
2008-5-13.Mwani_80010100
2008-5-13.Mwani_90000100
2008-5-13.Mwani_108001100
2008-5-13.Mwani_180001000
2008-5-13.Mwani_220001000
2008-5-13.Mwani_290001001
解决方案

以下是在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 00:20:32