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 中的概率热图 的相关文章

  • 替换列表列表中的元素

    The applyR 中的函数是简化 for 循环以获得输出的好方法 是否有一个等效的函数可以帮助人们在替换向量的值时避免 for 循环 通过示例可以更好地理解这一点 Take this list for example x list li
  • R 根据事件更新值

    我最近发布了这个问题 该问题已经与我在笔记本电脑上本地使用的 Mysql 数据库相关 由于我在 Mysql 中没有找到问题的解决方案 其他人似乎也没有找到解决方案 所以我想再次发布它 但现在与 R 相关 我使用带有 RMysql 包的数据库
  • 从 R 中的向量中选择所有可能的元组

    我正在尝试用 R 编写一个程序 当给定一个向量时 将返回所有可能的tuples http en wikipedia org wiki Tuples该向量中的元素 例如 元组 c a b c c a b c 出租车 c a c c b c c
  • 如何在R中删除重复项

    我有一个非常大的数据集 如下所示 df lt data frame school c a a a b b c c c year c 3 3 1 4 2 4 3 1 GPA c 4 4 4 3 3 3 2 2 school year GPA
  • 如何在 ggplot 中保持配色方案,同时删除每个图中未使用的级别?

    我想比较一个图中的数据的一些子组和另一图中的一些其他子组 如果我绘制一个图 其中绘制了所有子组 那么这个数字将是巨大的 并且每个单独的比较都会变得困难 我认为如果给定的子组在所有图中都具有相同的颜色 这对读者来说会更有意义 这是我尝试过的两
  • 是否可以通过扫描从控制台读取而不回显字符?

    这是一个示例函数 passwordEntry lt function cat Enter your password pwd lt scan n 1 what character quiet TRUE invisible pwd 并测试该功
  • numpy.histogram 的 hist 维度,密度 = True

    假设我有这个数组 A array 0 0019879 0 00172861 0 00527226 0 00639585 0 00242005 0 00717373 0 00371651 0 00164218 0 00034572 0 008
  • 如何从 R 运行带有特定模块的 perl 脚本?

    我可以从终端运行 perl 脚本 myperlscript pl 没有任何问题 但是 如果我尝试从 RStudio 中运行相同的 perl 脚本 则会出现以下错误 command lt myperlscript pl outputfile
  • 在 R 中创建一个运行计数变量?

    我有一个足球比赛结果的数据集 我希望通过创建一组类似于世界足球 Elo 公式的运行评级来学习 R 我遇到了麻烦 在 Excel 中看似简单的事情在 R 中并不完全直观 例如 4270 个观察中的前 15 个具有必要的变量 date t 1
  • 删除ggplot2中的负图区域[重复]

    这个问题在这里已经有答案了 如何删除 ggplot2 中 x 轴和 y 轴下方的绘图区域 请参见下面的示例 我尝试了几个主题元素 panel border panel margin plot margin 但没有任何运气 p lt ggpl
  • 重复测量引导统计数据,按多个因素分组

    我有一个看起来像这样的数据框 但显然还有更多行等 df lt data frame id c 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 cond c A A B B A A B B A A B B A A B B co
  • 如何使用 R 计算成为列表中中位数的概率?

    假设我有以下数据集 其中显示了假设实验的每个状态的三个观察结果的列表 state lt c Iowa Minnesota Illinois outcome lt list c 5 11 11 c 3 12 8 c 9 14 2 dat lt
  • 通过间接引用列来修改数据框中的某些值

    我正在整理一些数据 我们将失败的数据分类到垃圾箱中 并按批次计算每个分类箱的有限产量 我有一个描述排序箱的元表 这些行按升序测试顺序排列 一些排序标签带有非语法名称 sort tbl lt tibble tribble weight lab
  • 如何使用 usmap 标记数字而不是名称?

    我知道 usmap 有一个选项label in plot usmap 我想标记一些数字 而不是状态名称 我想 usmap 中应该有与州质心坐标相关的数据 但我不知道如何找到它 如果我能得到 坐标然后我可以用它来标记数字geom text 这
  • 绘制点之间的所有线

    我有以下 R 代码 x lt c 0 01848598 0 08052353 0 06741172 0 11652034 y lt c 0 4177541 0 4042247 0 3964025 0 4074685 d lt data fr
  • twitterR 和 ROAuth R 软件包安装

    我在安装 CRAN 上的 twitteR 和 RAOuth 软件包时遇到一些问题 我尝试了几种不同的方法 在 Windows 下使用源代码 在 Ubuntu 下使用 RStudio 我尝试了以下命令 sudo apt get install
  • API 请求和curl::curl_fetch_memory(url, handle = handle) 中的错误:SSL 证书问题:证书已过期

    几天前 我运行了代码几个月 没有任何问题 GET url myurl query 今天我遇到一个错误 Error in curl curl fetch memory url handle handle SSL certificate pro
  • 在 R 中创建虚拟变量,排除某些情况为 NA

    我的数据看起来像这样 V1 V2 A 0 B 1 C 2 D 3 E 4 F 5 G 9 我想创建一个虚拟变量R where 0 1 1 2 3 4 and NA 0 5 9 应该很简单 有人可以帮忙吗 我们可以转换V2 into a fa
  • 将阴影区域添加到五分位数之间的直方图中

    All 我有一个包含 2 个直方图的图表 其中我还绘制了代表第 20 40 60 和 80 个百分位数的线条 下面的代码使用虚拟数据重现了类似的图表 data lt rbind data frame x rnorm 1000 0 1 g o
  • 相当于 min() 的 rowMeans()

    我在 R 邮件列表上多次看到这个问题 但仍然找不到满意的答案 假设我有一个矩阵m m lt matrix rnorm 10000000 ncol 10 我可以通过以下方式获得每行的平均值 system time rowMeans m use

随机推荐

  • 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