ggplot 中的概率热图

2024-04-03

I asked this question https://stackoverflow.com/questions/7305803/plot-probability-heatmap-hexbin-with-different-sized-bins a year ago and got code for this "probability heatmap": heatmap

numbet <- 32
numtri <- 1e5
prob=5/6
#Fill a matrix 
xcum <- matrix(NA, nrow=numtri, ncol=numbet+1)
for (i in 1:numtri) {
x <- sample(c(0,1), numbet, prob=c(prob, 1-prob), replace = TRUE)
xcum[i, ] <- c(i, cumsum(x)/cumsum(1:numbet))
}
colnames(xcum) <- c("trial", paste("bet", 1:numbet, sep=""))

mxcum <- reshape(data.frame(xcum), varying=1+1:numbet, 
idvar="trial", v.names="outcome", direction="long", timevar="bet")


library(plyr)
mxcum2 <- ddply(mxcum, .(bet, outcome), nrow)
mxcum3 <- ddply(mxcum2, .(bet), summarize, 
            ymin=c(0, head(seq_along(V1)/length(V1), -1)), 
            ymax=seq_along(V1)/length(V1),
            fill=(V1/sum(V1)))
head(mxcum3)

library(ggplot2)

p <- ggplot(mxcum3, aes(xmin=bet-0.5, xmax=bet+0.5, ymin=ymin, ymax=ymax)) + 
geom_rect(aes(fill=fill), colour="grey80") + 
scale_fill_gradient("Outcome", formatter="percent", low="red", high="blue") +
scale_y_continuous(formatter="percent") +
xlab("Bet")

print(p)

(可能需要稍微更改此代码,因为this https://stackoverflow.com/questions/10146109/formatter-argument-in-scale-continuous-throwing-errors-in-r-2-15)

This is almost正是我想要的。除了每个垂直轴应具有不同数量的垃圾箱外,即第一个应有 2 个,第二个应有 3 个,第三个应有 4 个(N+1)。在图表中,轴 6 +7 具有相同数量的箱 (7),其中 7 应具有 8 (N+1)。

如果我是对的,代码这样做的原因是因为它是观察到的数据,如果我进行更多试验,我们会得到更多的垃圾箱。我不想依靠试验次数来获得正确的垃圾箱数量。

我如何调整此代码以提供正确的垃圾箱数量?


我用过Rdbinom生成头部的频率n=1:32现在进行试验并绘制图表。这将是你所期望的。我读过你之前关于 SO 和 on 的一些帖子math.stackexchange。我还是不明白你为什么想要simulate实验而不是从二项式 R.V. 生成如果你能解释一下,那就太好了!我将尝试使用 @Andrie 的模拟解决方案来检查我是否可以匹配下面显示的输出。现在,您可能会对以下内容感兴趣。

set.seed(42)
numbet <- 32
numtri <- 1e5
prob=5/6

require(plyr)
out <- ldply(1:numbet, function(idx) {
    outcome <- dbinom(idx:0, size=idx, prob=prob)
    bet     <- rep(idx, length(outcome))
    N       <- round(outcome * numtri)
    ymin    <- c(0, head(seq_along(N)/length(N), -1))
    ymax    <- seq_along(N)/length(N)
    data.frame(bet, fill=outcome, ymin, ymax)
})

require(ggplot2)
p <- ggplot(out, aes(xmin=bet-0.5, xmax=bet+0.5, ymin=ymin, ymax=ymax)) + 
geom_rect(aes(fill=fill), colour="grey80") + 
scale_fill_gradient("Outcome", low="red", high="blue") +
xlab("Bet")

The plot:

Edit:解释你的旧代码是如何产生的Andrie有效以及为什么它没有达到您的预期。

基本上,安德烈所做的(或者更确切地说是一种看待它的方式)是使用这样的想法:如果你有两个二项式分布,X ~ B(n, p) and Y ~ B(m, p), where n, m = size and p = probability of success,那么,他们的总和,X + Y = B(n + m, p)(1).所以,目的是xcum是为了获得所有人的结果n = 1:32折腾,但是为了更好地解释,让我一步步构造代码。除了解释之外,还有代码xcum也将非常明显,并且可以立即构建(无需任何for-loop并构建一个cumsum每次。

如果您到目前为止一直关注我,那么,我们的想法是首先创建一个numtri * numbet矩阵,每列 (length = numtri)有0's and 1's概率=5/6 and 1/6分别。也就是说,如果你有numtri = 1000第834章0's和 1661's*对于每个numbet列(此处=32)。让我们先构建并测试它。

numtri <- 1e3
numbet <- 32
set.seed(45)
xcum <- t(replicate(numtri, sample(0:1, numbet, prob=c(5/6,1/6), replace = TRUE)))

# check for count of 1's
> apply(xcum, 2, sum)
[1] 169 158 166 166 160 182 164 181 168 140 154 142 169 168 159 187 176 155 151 151 166 
163 164 176 162 160 177 157 163 166 146 170

# So, the count of 1's are "approximately" what we expect (around 166).

现在,每一列都是二项式分布的样本n = 1 and size = numtri。如果我们将前两列相加,并用该总和替换第二列,那么,从 (1) 开始,由于概率相等,我们最终将得到二项式分布n = 2。同样,如果您添加了前三列并用该总和替换了第三列,您将获得二项式分布n = 3等等... 这个概念是如果你cumulatively添加每一列,然后你最终得到numbet二项式分布的数量(此处为 1 到 32)。那么,让我们这样做吧。

xcum <- t(apply(xcum, 1, cumsum))

# you can verify that the second column has similar probabilities by this:
# calculate the frequency of all values in 2nd column.
> table(xcum[,2])
  0   1   2 
694 285  21 

> round(numtri * dbinom(2:0, 2, prob=5/6))
[1] 694 278  28
# more or less identical, good!

如果你划分xcum,到目前为止我们已经生成了cumsum(1:numbet)以这种方式在每一行上:

xcum <- xcum/matrix(rep(cumsum(1:numbet), each=numtri), ncol = numbet)

这将与xcum出来的矩阵for-loop(如果您使用相同的种子生成它)。但是我不太明白 Andrie 进行这种划分的原因,因为这对于生成您需要的图表来说不是必需的。不过,我认为这与frequency你谈到的价值观在先前关于 math.stackexchange 的文章中 https://math.stackexchange.com/questions/37655/calculate-number-of-sequences-in-frequency-matrix

现在谈谈为什么你很难获得我所附的图表(带有n+1 bins):

对于二项式分布n=1:32试验,5/6作为尾部(失败)的概率和1/6作为正面(成功)的概率,k头数由下式给出:

nCk * (5/6)^(k-1) * (1/6)^k # where nCk is n choose k

对于我们生成的测试数据,对于n=7 and n=8(试验),概率k=0:7 and k=0:8头由下式给出:

# n=7
   0    1    2     3     4     5 
.278 .394 .233  .077  .016  .002 

# n=8
   0    1    2    3     4      5 
.229 .375 .254 .111  .025   .006 

为什么它们都有 6 个垃圾箱,而不是 8 个和 9 个垃圾箱?当然这也和它的价值有关numtri=1000。让我们通过使用以下命令直接从二项式分布生成概率来看看这 8 个和 9 个箱中每个箱的概率是多少dbinom了解为什么会发生这种情况。

# n = 7
dbinom(7:0, 7, prob=5/6)
# output rounded to 3 decimal places
[1] 0.279 0.391 0.234 0.078 0.016 0.002 0.000 0.000

# n = 8
dbinom(8:0, 8, prob=5/6)
# output rounded to 3 decimal places
[1] 0.233 0.372 0.260 0.104 0.026 0.004 0.000 0.000 0.000

你会看到对应的概率k=6,7 and k=6,7,8对应于n=7 and n=8 are ~ 0。它们的价值非常低。这里的最小值是5.8 * 1e-7实际上 (n=8, k=8)。这意味着如果您模拟的话,您有机会获得 1 值1/5.8 * 1e7次。如果您检查相同的n=32 and k=32,值为1.256493 * 1e-25。因此,您必须模拟那么多值才能获得至少 1 个结果,其中所有值32结果是走向n=32.

这就是为什么您的结果没有某些箱的值,因为对于给定的箱来说,具有该值的概率非常低numtri。出于同样的原因,直接从二项分布生成概率克服了这个问题/限制。

我希望我已经写得足够清楚,以便您能够理解。如果您遇到困难请告诉我。

Edit 2:当我模拟上面刚刚编辑的代码时numtri=1e6,我得到这个n=7 and n=8并计算出头的数量k=0:7 and k=0:8:

# n = 7
     0      1      2      3      4      5      6      7 
279347 391386 233771  77698  15763   1915    117      3 

# n = 8
     0      1      2      3      4      5      6      7      8 
232835 372466 259856 104116  26041   4271    392     22      1 

请注意,对于 n=7 和 n=8,现在有 k=6 和 k=7。另外,对于 n=8,k=8 的值为 1。随着增加numtri您将获得更多其他丢失的垃圾箱。但这需要大量的时间/内存(如果有的话)。

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

ggplot 中的概率热图 的相关文章

  • 如何从 R 数据框中提取关键字

    我是 R 中文本挖掘的新手 我想从数据框的列中删除停用词 即提取关键字 并将这些关键字放入新列中 我尝试制作一个语料库 但它对我没有帮助 df C3是我目前拥有的 我想添加栏目df C4 但我无法让它工作 df lt structure l
  • R 编程常用工具

    如果已经以不同的方式问过这个问题 我深表歉意 但我找不到任何达到我想要的东西 我真的是从其他软件包 SPSS 开始接触 R 的 当我了解真正可以做什么时 我意识到我还需要其他 工具 这让我想到了我的问题 您有哪些用于开发 R 代码的设置 我
  • 读取R中打开的Excel文件

    有没有办法将打开的Excel文件读入R 当Excel中打开一个excel文件时 Excel会对文件加锁 比如R中的read方法无法访问该文件 你能绕过这个锁吗 Thanks 编辑 这发生在带有原始 Excel 的 Windows 下 发生错
  • 按特定样本前缀对列名称向量进行子集化

    假设我有一个如下所示的数据框 ca01 lt c 1 10 ca02 lt c 2 11 ca03 lt c 3 12 stuff 1 lt rep test 10 other lt rep 9 10 data lt data frame
  • 使用大矩阵操作

    我必须使用 big matrix 对象 并且无法计算某些函数 让我们考虑以下大矩阵 create big matrix object x lt as big matrix matrix sample 1 10 20 replace TRUE
  • 删除字符串末尾的句点和数字

    如何删除尾随句点 后面紧跟一个数字 长度为一位或两位数字 例子 z lt c awe p 56 red 45 ted 5 you 88 tom 我只想删除 45和 5 你只需要一个简单的正则表达式 z new gsub 0 9 z 一些评论
  • 融化R中的下半矩阵

    如何融化下半三角形加对角矩阵 11 NA NA NA NA 12 22 NA NA NA 13 23 33 NA NA 14 24 34 44 NA 15 25 35 45 55 A lt t matrix c 11 NA NA NA NA
  • R 中按时间划分的平均值

    我每秒测量一次化合物浓度 我想求 30 秒和 60 秒的平均值 我一直在阅读这里的帖子 我尝试过lubridate and dplyr 但没有运气 我正在努力完成这项工作 但我一直没能做到 我正在从 SAS 过渡到 R 所以请耐心等待 这是
  • 获取函数的命名空间

    我正在开发一个包 我希望在其中向对象添加编辑历史记录 该包允许其他包注册用于编辑对象的函数 我正在寻找一种方法来记录注册用于编辑的函数的包的版本 问题是 给定一个函数 如何从导出的位置获取包 我的想法是调查它的搜索路径 但是search 仅
  • 跟踪循环迭代

    抛硬币 成功 你赢100 否则你输50 你会一直玩 直到你口袋里有钱a 的价值如何a在任何迭代中都被存储 a lt 100 while a gt 0 if rbinom 1 1 0 5 1 a lt a 100 else a lt a 50
  • 从 n,k 维矩阵数组中减去 n,k 维矩阵

    如果我有一个数组A A lt array 0 c 4 3 5 for i in 1 5 set seed i A i lt matrix rnorm 12 4 3 如果我有矩阵 B set seed 6 B lt matrix rnorm
  • 在 R 传单中添加不透明度滑块

    如何在 R leaflet 应用程序中添加滑块来控制特定图层的不透明度 对于这个应用程序 我不想使用闪亮 这里建议 在 R 传单应用程序中添加滑块 https stackoverflow com questions 37682619 add
  • R中的字典数据结构

    在 R 中 我有 例如 gt foo lt list a 1 b 2 c 3 如果我输入foo I get a 1 1 b 1 2 c 1 3 我怎样才能看透foo仅获取 键 列表 在这种情况下 a b c R 列表可以具有命名元素 因此可
  • 为什么数据帧上的 is.vector 不返回 TRUE?

    tl dr R 中的向量到底是什么 长版 R 中很多东西都是向量 例如 数字是长度为 1 的数值向量 is vector 1 1 TRUE 列表也是一个向量 is vector list 1 1 TRUE 好的 所以列表是一个向量 显然 数
  • 将 ftransform 与折叠 R 包中的 fgroup_by 一起使用

    我正在尝试重现以下输出dplyr代码与R包裹collapse dplyr Code library tidyverse starwars gt select name mass species gt group by species gt
  • 使用officer R导出时如何提高ggplots的分辨率

    我想将图表导出到 PPT 并使用Officer 包来实现相同的目的 但是 图表的默认分辨率较低 我想更改它 我目前正在使用以下电话 ph with gg p1 type chart res 1200 其中 p1 是 ggplot 对象 运行
  • R 中两个时间戳之间的左连接

    我的目标是执行左连接intervals哪里的bike id比赛和created at时间戳在records在 之间start and end in the intervals table gt class records 1 data ta
  • 正态分布平均值的贝叶斯推理玩具 R 代码 [降雪量数据]

    我有一些降雪观测 x lt c 98 044 107 696 146 050 102 870 131 318 170 434 84 836 154 686 162 814 101 854 103 378 16 256 我被告知它遵循正态分布
  • 警告消息 - 来自 dummies 包的 dummy

    我正在使用 dummies 包为分类变量生成虚拟变量 其中一些变量具有两个以上类别 testdf lt data frame A as factor c 1 2 2 3 3 1 B c A B A B C C C c D D E D D E
  • 如何在 data.table 中分组后使用条件计算行数

    我有以下数据框 dat lt read csv s1 s2 v1 v2 a b 10 20 a b 22 NA a b 13 33 c d 3 NA c d 4 5 NA c d 10 20 dat gt A tibble 6 x 4 gt

随机推荐

  • FromBody不绑定字符串参数

    我有一个类似的问题ASP NET MVC 4 RC Web API 参数绑定问题 https stackoverflow com questions 11158617 asp net mvc 4 rc web api parameter b
  • 在 Windows 上从 C++ 调用 R 函数

    我正在尝试在 Windows 上从 C 调用 R 函数 我正在使用 MinGW 来编译程序 但它在编译时抛出错误 代码 取自Dirk 和编译错误如下 include
  • Flutter:热重载后应用程序不断返回初始路线

    我刚刚按照迁移指南将 FireBase 插件升级到最新版本https firebase flutter dev docs migration https firebase flutter dev docs migration并开始注意到 每
  • SublimeREPL:Python - 运行当前文件

    当前在 SublimeText 中打开 python 脚本 我选择 工具 gt SublimeREPL gt Python gt 运行当前文件 Sublime 在新的目录中执行脚本交互的 REPL python 窗口 该窗口仍在 Subli
  • java和php可以集成吗

    我需要将一个java类集成到php程序中 这可能吗 如果可以 请解释一下 我认为这是可能的 检查一下 PHP 到 Java 的桥梁 http www projectzero org sMash 1 1 x docs zero devguid
  • 自定义错误处理和康康舞

    我正在尝试实现自定义错误处理以及使用 CanCan 当用户到达不允许访问的区域时 会引发 CanCan AccessDenied 错误 并且应将其发送到根 url 相反 rescue from Exception 捕获 CanCan Acc
  • Lucene 搜索具有特定字段的文档?

    Lucene Net 有没有办法查询包含特定字段的文档 假设我的一些文档有 食物 字段 而有些则没有 我想找到所有包含字段 foo 的文档 无论 foo 的值是什么 我该怎么做呢 它是某种 TermQuery 吗 尝试 foo TO 应该适
  • 如何使用java仅获取mongodb中文档的objectId

    我只想从 mongodb 中获取具有匹配条件的 objectId 我可以使用 db 对象和游标方法获取它 但我在这里使用 mongo 客户端 不知道该怎么做 感谢您 MongoClient client new MongoClient lo
  • 返回 JSON 和文件

    如何返回 JSON 响应和文件响应 现在我这样做 runNumber A0001 response None try response make response Line One r nLine Two r n response head
  • 按相等性对对象进行分组

    我有一个对象集合 我想使用如下所示的方法来比较它们的相等性 bool AreEqual MyObject O1 MyObject O2 将所有相同对象分组的最性能友好的方式是什么 显而易见的答案是将每个对象与集合中的所有其他对象进行比较 但
  • 减去数据框中的两列

    我的 df 看起来如下 Index Country Val1 Val2 Val10 1 Australia 1 3 5 2 Bambua 12 33 56 3 Tambua 14 34 58 我想从每个国家 地区的 Val1 中减去 Val
  • SQL Server 中 IsInteger 的最佳等效项

    在 SQL Server 2000 2005 2008 中确定字段值是否为整数的最佳方法是什么 IsNumeric 对于多种不太可能转换为整数的格式返回 true 示例包括 15 000 和 15 1 您可以使用类似的语句 但这似乎只适用于
  • Docker 检查格式检索端口映射[重复]

    这个问题在这里已经有答案了 我想使用 docker Inspection 检索映射到容器的端口 我发现了类似的内容 docker inspect format NetworkSettings Ports containerid Output
  • 如何进行空合并提交(忽略更改)?

    自动化 CI 工具合并了来自release to master 但是来自发布分支的一些提交应该被忽略 让我们考虑以下示例 发布分支包含两个修复 fix 1应该被忽略并且fix 2应该合并到master base merge fix 2 ma
  • jboss 7 oracle数据源配置

    我目前正在从 jboss 4 3 迁移到 jboss 7 1 1 Final 我正在尝试配置 Oracle 数据源 但它不起作用 以下是我为设置 Oracle 数据源所做的操作 1 下载ojdbc6 11 jar并将其放在文件夹 JBOSS
  • 使用 bootstrap 4 对 3 列进行排序和堆叠

    I have this structure in bootstrap columns And I want you to change to a lower resolution be ordered as follows 我在这里找到了如
  • PHP 致命错误:未找到“COM”类

    将 PHP 升级到 v 5 5 1 后 我收到此错误 Fatal error Class COM not found in C inetpub wwwroot ndsystems database engine mssql engine p
  • 如何使用 nth-child 为具有行跨度的表格设置样式?

    我有一张表 其中一行使用行跨度 所以 table tr td td td td td td tr tr td td td td td td tr tr td td td td tr tr td td td td td td tr table
  • 如何在 Java 中将日期从 MM/YYYY 转换为 MM/DD/YYYY

    我想将日期从 MM YYYY 转换为 MM DD YYYY 我如何使用 Java 中的 SimpleDateFormat 来做到这一点 注 DD可以是该月的开始日期 请浏览http download oracle com javase 1
  • ggplot 中的概率热图

    I asked this question https stackoverflow com questions 7305803 plot probability heatmap hexbin with different sized bin