如何从 R 中的高斯分布创建二维数据集?
How to create 2D data set from Gaussian distribution in R?
我需要创建“包含 200 个样本的 2D 数据集,这些样本是从具有非对角协方差矩阵的多元高斯分布创建的”,但我既不是统计学家也不是数学家,我并不完全明白这个.
这是我的理解。对角矩阵是主对角线以外的元素全为零的矩阵。因此,我假设非对角线意味着一个矩阵在主对角线外的条目中不全为零,这样任何随机矩阵都可以,对吗?所以,我开始创建一个随机矩阵,因为这里没有说明任何大小,我只是做了 100x100:
m <- matrix(rnorm(100*100), 100, 100)
我不知道如何实现其余部分。我知道创建样本的 sample()
函数,但我如何创建“包含 200 个样本的二维数据集,这些样本是从多元高斯分布创建的”?
只要你有均值向量和协方差矩阵,通过MASS:::mvrnorm
模拟多元正态分布就非常简单。查看 ?mvrnorm
了解如何使用此功能。
如果对协方差矩阵没有特殊要求,即随机协方差矩阵即可。您需要先创建一个合适的协方差矩阵。
协方差矩阵必须是正定的。我们可以通过取满秩矩阵的叉积来创建正定矩阵。也就是说,如果 n * p (n >= p)
矩阵 X
具有完整的列秩,则 A = X' %*% X
是正定的(因此是适当的协方差)。
让我们先生成一个随机的X
矩阵:
p <- 100 ## we want p-dimensional multivariate normal
set.seed(0); X <- matrix(runif(p * p), p, p) ## this random matrix has full rank
然后得到一个协方差矩阵:
COV <- crossprod(X) ## t(X) %*% X but about 2 times faster
我们还需要均值向量。假设它们是 0 均值:
mu <- rep(0, p)
现在我们调用MASS:::mvrnorm
进行随机抽样:
library(MASS) ## no need to install
x <- mvrnorm(1000, mu, COV) ## mvrnorm(sample.size, mean, covariance)
现在 x
包含来自 100 维(p 维)多元正态分布的 1000 个样本,均值 mu
和协方差 COV
。
> str(x)
num [1:1000, 1:100] 1.66 -2.82 6.62 6.46 -3.35 ...
- attr(*, "dimnames")=List of 2
x
是一个矩阵,每一行都是一个随机样本。所以我们总共有 1000 行。
对于多元正态,边缘分布仍然是正态的。因此,我们可以绘制边缘的直方图。以下草图第1、10、20、30边缘:
par(mfrow = c(2,2))
hist(x[, 1], main = "1st marginal")
hist(x[, 10], main = "10th marginal")
hist(x[, 20], main = "20th marginal")
hist(x[, 30], main = "30th marginal")
我需要创建“包含 200 个样本的 2D 数据集,这些样本是从具有非对角协方差矩阵的多元高斯分布创建的”,但我既不是统计学家也不是数学家,我并不完全明白这个.
这是我的理解。对角矩阵是主对角线以外的元素全为零的矩阵。因此,我假设非对角线意味着一个矩阵在主对角线外的条目中不全为零,这样任何随机矩阵都可以,对吗?所以,我开始创建一个随机矩阵,因为这里没有说明任何大小,我只是做了 100x100:
m <- matrix(rnorm(100*100), 100, 100)
我不知道如何实现其余部分。我知道创建样本的 sample()
函数,但我如何创建“包含 200 个样本的二维数据集,这些样本是从多元高斯分布创建的”?
只要你有均值向量和协方差矩阵,通过MASS:::mvrnorm
模拟多元正态分布就非常简单。查看 ?mvrnorm
了解如何使用此功能。
如果对协方差矩阵没有特殊要求,即随机协方差矩阵即可。您需要先创建一个合适的协方差矩阵。
协方差矩阵必须是正定的。我们可以通过取满秩矩阵的叉积来创建正定矩阵。也就是说,如果 n * p (n >= p)
矩阵 X
具有完整的列秩,则 A = X' %*% X
是正定的(因此是适当的协方差)。
让我们先生成一个随机的X
矩阵:
p <- 100 ## we want p-dimensional multivariate normal
set.seed(0); X <- matrix(runif(p * p), p, p) ## this random matrix has full rank
然后得到一个协方差矩阵:
COV <- crossprod(X) ## t(X) %*% X but about 2 times faster
我们还需要均值向量。假设它们是 0 均值:
mu <- rep(0, p)
现在我们调用MASS:::mvrnorm
进行随机抽样:
library(MASS) ## no need to install
x <- mvrnorm(1000, mu, COV) ## mvrnorm(sample.size, mean, covariance)
现在 x
包含来自 100 维(p 维)多元正态分布的 1000 个样本,均值 mu
和协方差 COV
。
> str(x)
num [1:1000, 1:100] 1.66 -2.82 6.62 6.46 -3.35 ...
- attr(*, "dimnames")=List of 2
x
是一个矩阵,每一行都是一个随机样本。所以我们总共有 1000 行。
对于多元正态,边缘分布仍然是正态的。因此,我们可以绘制边缘的直方图。以下草图第1、10、20、30边缘:
par(mfrow = c(2,2))
hist(x[, 1], main = "1st marginal")
hist(x[, 10], main = "10th marginal")
hist(x[, 20], main = "20th marginal")
hist(x[, 30], main = "30th marginal")