制作具有行和列约束的随机存在/不存在矩阵(因此是布尔值)

2024-04-27

我正在尝试在 R 中创建一个随机矩阵。它需要是一个存在/不存在矩阵,以便矩阵中的所有值都为 0 或 1。

但我还需要指定行和列总计,例如 5x5 表,其中

  • 行总计为 r1 = 4、r2 = 2、r3 = 3、r4 = 5、r5 = 3
  • 列总计为 c1 = 5、c2 = 1、c3 = 5、c4 = 2、c5 = 4

我本来希望使用r2dtable(),但我不认为你可以强制这个函数只使用0 和 1。我尝试过使用r2dtable()但最终得到了价值观高于1。有什么想法吗?


这是群落生态学中的一个经典(也是难题)问题。这picante包具有基于 Miklos & Podani (2004) 的蒙特卡罗算法,该算法在保留边距的同时随机化二进制矩阵。However,该算法假设您start使用保留约束的二进制矩阵;然后,它会根据您的需要提供任意数量的具有这些约束的随机矩阵。

我想不出一种简单的算法来生成二进制矩阵(甚至是非随机的),并满足用作起始值的约束,所以我使用了蛮力 - 我使用r2dtable()生成lots矩阵并发现其中一些是二元矩阵。

开始了 ...

r2dtable 生成起始矩阵

rt <- c(4, 2, 3, 5, 3)
ct <- c(5, 1, 5, 2, 4)
set.seed(101)
system.time(tt <- r2dtable(100000, rt, ct))  ## 0.06 seconds
w <- which(sapply(tt, max) == 1)
length(w) ## 36/100000 (0.036%) are binary
m0 <- tt[[w[1]]]  ## pick the first one

如果你不关心效率,你可以到此为止。但是,如果您需要数千个满足条件的矩阵,那么第二阶段更好......

尝试交换洗牌

Miklos 和 Podani 的算法进行“试验交换”(交换行/列对以保留行/列总计);默认情况下,它会进行 1000 次交换来随机化矩阵。

library(picante)
results <- list(m0)
nm <- 100000
pb <- txtProgressBar(max = nm, style = 3)
system.time(
  for (i in 1:nm) {
   setTxtProgressBar(pb, i)
   results[[i+1]] <- randomizeMatrix(results[[i]], null.model = "trialswap")
  }
)

这在我的机器上会在 7 秒内生成 10^5 矩阵(这将花费大约 20 倍的时间)r2dtable(),根据我的计算)。

然而 ...

所有的10^5矩阵都是这样生成的,and全部r2dtable满足约束的矩阵(只有 36 个)是相同的! (我们通过将整个矩阵折叠成一个二进制字符串来进行比较......)可能只有一个矩阵满足这些约束,或者可能在一个非常大的空间中有一个非常小的数字,因此很难从其中洗牌一个对另一个...

table(sapply(results, paste, collapse = ""))
## 1111100010111111001010111 
##                    100001 
table(sapply(tt[w], paste, collapse = ""))
## 1111100010111111001010111 
##                       36

最后的想法

  • 如果您已经有一个满足约束的(可能是非随机的)矩阵,或者您有一个合理的算法来生成单个实例,那么您就可以开始
  • 试验交换算法应该能够很好地扩展(到更大的尺寸); Miklos 和 Podani (2004) 提出的两个例子分别是 56x28 和 118x80。这r2dtable()然而,hack 的规模将会非常大。如果你的实际问题比 5x5 大得多,那就不切实际了。 (模拟退火或遗传算法可能会找到一个初始矩阵——从满足行约束的随机矩阵开始,并使用等于列约束平方偏差的目标函数进行洗牌——但我懒得花时间搞清楚了。)

Miklos I. & Podani J. 2004。存在-不存在矩阵的随机化:评论和新算法。生态学 85:86-92。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

制作具有行和列约束的随机存在/不存在矩阵(因此是布尔值) 的相关文章

  • CSS3 矩阵 3d 矩形到梯形的转换

    我正在尝试使用 webkit 对 CSS3 的支持transform matrix3d
  • 在r包中重新导出数据集

    In R包 有可能重新导出函数 这使得很容易回收相同的函数 而不必在不同的包之间重复代码 例如 devtools session info函数是重新导出sessioninfo session info export importFrom s
  • 我想优化这个短循环

    我想优化这个简单的循环 unsigned int i while j 0 j is an unsigned int with a start value of about N 36 000 000 float sub 0 i 1 unsig
  • 尝试通过列表递归时,在 R 中出现错误“递归索引在级别 2 失败”

    当我尝试递归遍历图形顶点列表 将它们的值与列表中的一组颜色进行匹配时 出现错误 递归索引在级别 2 失败 我的颜色列表如下 colrs lt list l blue c red n gray50 然后我有一个 igraph 中的顶点列表vs
  • R 中多类分类的 ROC 曲线

    我有一个包含 6 个类别的数据集 我想绘制多类别分类的 ROC 曲线 Achim Zeileis 给出的第一个答案非常好 R中使用rpart包的ROC曲线 https stackoverflow com questions 30818188
  • dplyr :过滤一系列行(在一列中)

    虚拟数据框 id family lt c 1 1 2 2 3 3 people lt c male female male female male children dataset lt data frame id family peopl
  • 用于插入/删除/排名/选择查询的最佳数据结构/算法

    到目前为止 我知道像AVL树和红黑树这样的自平衡BST可以在O log n 次内完成这些操作 然而 要使用这些结构 我们必须自己实现AVL树或RB树 我听说有一个算法 实现这四个操作而不使用自平衡 BST 有了我们自己定义的结构 我们就需要
  • 在 R 中将文本文件拆分为段落文件

    我正在尝试将一个巨大的 text 文件拆分为多个 text 文件 每个文件仅包含一个段落 让我举个例子 我需要这样的文字 这是第一段 这没有任何意义 因为这只是一个例子 这是第二段 和前一段一样毫无意义 另存为两个独立的 txt 文件 其中
  • 如何设置K-means openCV c++的初始中心

    我正在尝试使用 OpenCv 和 Kmeans 对图像进行分割 我刚刚实现的代码如下 include opencv2 objdetect objdetect hpp include opencv2 highgui highgui hpp i
  • 交换两个向量之间的值,使两个向量的 max_element 之和最小

    这是 Codechef 的问题 但请耐心等待 https www codechef com ZCOPRAC problems ZCO16001 https www codechef com ZCOPRAC problems ZCO16001
  • 有条件地将可选组替换为 gsub

    一位用户问我如何做到这一点如何使 ggplot 图例中的选定单词变为斜体 https stackoverflow com questions 76054997 how to italicize select words in a ggplo
  • 使用 Rcpp 得出斐波那契数列的意外结果

    我刚刚开始使用Rcpp很抱歉 如果我错过了一个简单的步骤或类似的东西 我已经尝试过这个 sourceCpp library Rcpp sourceCpp code include
  • 完全缺失列的 VaR 计算

    我需要计算股票收益的滚动 VaR 从这篇文章 使用rollapply函数使用R进行VaR计算 https stackoverflow com questions 25045612 using rollapply function for v
  • 如何动态查找连接组件

    使用不相交集数据结构可以很容易地得到图的连通分量 而且 它只是支持增量连接组件 http www boost org doc libs 1 46 1 libs graph doc incremental components html 然而
  • 从 Cox PH 模型预测概率

    我正在尝试使用 cox 模型来预测时间 称为停止 3 后失败的概率 bladder1 lt bladder bladder enum lt 5 coxmodel coxph Surv stop event rx size number cl
  • 加密成本高,解密成本低

    我希望该用户 攻击者加密数据并发送给服务器 现在我想要一种与标准算法完全相反的算法 使用快 难以解密 即很难使用服务器发送的密钥来加密密码等数据 以防止随机攻击 但很容易解密这样服务器在验证用户时消耗的时间非常少 但是对于攻击者来说 每次使
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • Rglpk - 梦幻足球阵容优化器 - For 循环输出的 Rbind

    我有一个使用 Rgplk 的梦幻足球阵容优化器 它使用for循环生成多个最佳阵容 其数量由用户输入 代码如下 Lineups lt list for i in 1 Lineup no matrix lt rbind as numeric D
  • 在多面图中用 N 注释 x 轴

    我正在尝试生成一些按治疗条件和访问次数细分的数字结果的箱线图 每个框中的观察次数都放在图下方 并且也标记了访问次数 这里有一些虚假数据可以用来说明 我举了两个我尝试过但不太有效的例子 library ggplot2 library plyr
  • UITableView 自动调整行大小约束在 iPhone 6Plus 上神秘破坏

    我有一个自定义的 UITableViewCell 它有一个缩略图和一堆文本 行高配置为使用自动计算 tableView estimatedRowHeight 129 tableView rowHeight UITableViewAutoma

随机推荐