如何在r中创建一个具有正态分布的矩阵?

Posted

技术标签:

【中文标题】如何在r中创建一个具有正态分布的矩阵?【英文标题】:How to create a matrix with a normal distribution in it in r? 【发布时间】:2018-05-08 13:23:26 【问题描述】:

我想要一个像素网格,其中填充正态分布的值,如下图所示

有人知道如何在 R 中做到这一点吗?

【问题讨论】:

计算值的逻辑应该如何?你试图产生什么结果?图形类型是 heatmap 【参考方案1】:

不清楚你想做什么。您是在问如何从双变量正态分布中采样?或者如何创建热图?或者如何将文本叠加到热图上?不过好吧,我咬一口……

这是一个从头开始的示例,如何生成数据并生成热图,其中的数字表示每个 bin 框的计数。

# Create sample data
require(MASS);
set.seed(2017);
mu <- c(5, 5);
sigma <- diag(c(2, 2));
df <- as.data.frame(mvrnorm(10000, mu = mu, Sigma = sigma));
colnames(df) <- c("x1", "x2");

# Bin breaks
nbins <- 20;
breaks_x <- seq(floor(min(df$x1)), ceiling(max(df$x1)), length.out = nbins);
breaks_y <- seq(floor(min(df$x2)), ceiling(max(df$x2)), length.out = nbins);

# Frequency table
freq <-  as.data.frame(table(
    as.numeric(cut(df$x1, breaks = breaks_x)),
    as.numeric(cut(df$x2, breaks = breaks_y))));

# Plot matrix
mat <- diag(nbins) * 0;
mat[cbind(freq[, 1], freq[, 2])] <- freq[, 3];
image(breaks_x, breaks_y, mat, col= rainbow(10));
text(breaks_x[freq$Var1], breaks_y[freq$Var2], freq$Freq, cex = 0.8);

或者,如果您只对热图感兴趣,您可以使用 ggplot2stat_bin2d

require(ggplot2);
ggplot(data.frame(df), aes(x1, x2)) + stat_bin2d(bins = 20) + scale_fill_gradientn(colours = rainbow(32));

gplots::hist2d

更多选项请参见here...

【讨论】:

非常感谢!这可能会更容易一些,因为我不理解你的每一行代码......:-) @Robert 不客气。正如您所注意到的,您的问题引起了相当多的负面评价。那是因为 SO 不是一个让您要求其他人为您编写代码的论坛;这也不是一个教你 R 的论坛。像你这样的问题通常是不受欢迎的。相反,SO 成员非常乐意帮助调试/改进代码,在您自己进行了大量可见的研究之后。所以作为对未来的一条建议,你应该take the SO tour和学习how to ask questions)。 知道了。但是由于我看不懂代码我想自己尝试一下。

以上是关于如何在r中创建一个具有正态分布的矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

在Python中创建生成稀疏矩阵(均匀分布高斯分布)

在Python中创建生成稀疏矩阵(均匀分布高斯分布)

如何在给定标准偏差(sigma)的 PHP 中创建正态分布的随机数?

如何在立方体中创建一个均匀的spheries随机分布?

在R中创建连续热图

在R中创建栅格直方图