R语言计算离散值序列相邻元素对联合概率的实现方法
R实现离散序列相邻元素联合概率计算
R没有专门用于计算序列相邻元素联合概率的内置函数,但可以通过基础函数的组合快速实现,无需安装额外第三方包:
基础R实现步骤
- 第一步:构造相邻元素配对矩阵
用head()和tail()分别截取原序列去掉末尾1位、去掉开头1位的子序列,再按列拼接即可得到所有相邻对:# 示例离散序列 X <- c(1, 2, 1, 2, 2, 1, 1, 2, 3, 1, 2) # 生成相邻对 adj_pairs <- cbind(prev = head(X, -1), curr = tail(X, -1)) - 第二步:计算相邻对联合频数
直接调用table()函数统计不同配对的出现次数:joint_freq <- table(adj_pairs) - 第三步:转换为联合概率
用频数除以总相邻对数量即可得到联合概率,也可以直接调用prop.table()函数实现:
输出的# 方法1:手动除以总对数 joint_prob <- joint_freq / nrow(adj_pairs) # 方法2:调用prop.table快速转换 joint_prob <- prop.table(joint_freq)joint_prob为矩阵格式,行对应前一个元素的取值,列对应后一个元素的取值,单元格数值即为P(prev=a, curr=b)的联合概率。
扩展:获取每个相邻位置对应的概率值
如果需要给原序列每一组相邻对匹配对应的联合概率,可以将概率表转换为数据框后做匹配:
prob_df <- as.data.frame(joint_prob, responseName = "joint_prob") adj_pairs_with_prob <- merge(adj_pairs, prob_df, by = c("prev", "curr"), sort = FALSE)
注意事项
- 如果你的序列是分类变量,建议先转换为因子类型,避免数值型取值的自动排序影响结果展示
- 执行计算前需要确认序列长度≥2,否则会因为没有相邻对抛出异常
内容的提问来源于stack exchange,提问作者AnonymousMe
相关产品推荐
相关产品推荐

