在所有其他条件相同的情况下,估计多维正态分布的参数以达到给定的置信度以指定的精度范围内所需的数据量不会随维度而变化。 因此,您可以将二维的任何经验法则应用于更高维度的问题,而无需进行任何更改。
为什么要这样 参数只有三种:均值,方差和协方差。均值中的估计误差仅取决于方差和数据量。因此,当(X 1,X 2,... ,X d)具有多元正态分布和X 我具有方差σ 2 我,则估计ë [ X 我 ]仅取决于σ 我和Ñ。自何处,以达到足够的精度估计所有的ñ(X1个,X2,…,Xd)Xiσ2一世E[Xi]σin,我们只需要考虑所需的数据量 X 我具有最大的 σ 我。因此,当我们考虑的问题,估计连续增加尺寸 ð,我们需要考虑的是多少最大 σ 我将增加。当这些参数处于上述范围内时,我们得出结论,所需的数据量与维度无关。E[Xi]Xiσidσi
类似的考虑适用于估计方差和协方差σ 我Ĵ:如果用于估计一定量的数据就足够了的一个协方差(或相关系数),以期望的精确度,那么-提供底层正常分布具有类似的参数值- -相同数量的数据就足以估算任何协方差或相关系数。σ2iσij
为了说明这一点并提供实证支持,让我们研究一些模拟。以下内容为指定尺寸的多正态分布创建参数,从该分布中绘制许多独立的,相同分布的向量集,从每个此类样本中估计参数,并根据(1)平均值来总结这些参数估计的结果- -证明它们没有偏见(并且代码正常工作-和(2)它们的标准偏差,这些偏差量化了估计的准确性。(请勿混淆这些标准偏差,这些标准偏差将量化在多个模拟迭代,使用标准偏差定义基本的多态分布!发生变化,但前提是随着 d发生变化,我们不会在基础多重正态分布本身中引入较大的方差。dd
在此模拟中,通过使协方差矩阵的最大特征值等于来控制基础分布的方差大小。随维数的增加,无论这种云的形状如何,都将其概率密度“云”保持在范围之内。通过改变特征值的生成方式,可以简单地创建随着尺寸增加而对系统行为的其他模型的仿真。下面的代码注释掉了一个示例(使用Gamma分布)。1R
我们正在寻找的是验证当尺寸改变时参数估计的标准偏差没有明显改变。因此,我示出了用于两个极端,结果d = 2和d = 60,使用相同的数据量(30在两种情况下)。 值得注意的是,当d = 60时估计的参数数量等于1890,远远超过了向量的数量(30),甚至超过了整个数据集中的单个数字(30 * 60 = 1800)。dd=2d=6030d=6018903030∗60=1800
让我们从二维开始,。有五个参数:两个方差(此模拟中的标准偏差为0.097和0.182),协方差(SD = 0.126)和两个平均值(SD = 0.11和0.15)。对于不同的模拟(可以通过更改随机种子的起始值来获得),这些模拟会有所不同,但是当样本大小为n = 30时,它们将始终具有可比较的大小。举例来说,在接下来的模拟SDS是0.014,0.263,0.043,0.04和0.18d=20.0970.1820.1260.110.15n=300.0140.2630.0430.040.18,分别:它们都发生了变化,但是数量级可比。
(这些陈述在理论上可以得到支持,但这里的目的是提供纯粹的经验证明。)
现在我们移至,将样本大小保持在n = 30。具体来说,这意味着每个样本包含30个向量,每个向量具有60个分量。除了列出所有1890个标准偏差外,我们仅使用直方图查看它们的图片,以描述其范围。d=60n=3030601890
sigma
σmu
μ104此模拟中次迭代。灰色的参考线标志着完全平等的轨迹:显然,估算工作是按预期进行的,并且没有偏见。
0.080.120.040.08d=20.080.13d=2d260
代码如下。
#
# Create iid multivariate data and do it `n.iter` times.
#
sim <- function(n.data, mu, sigma, n.iter=1) {
#
# Returns arrays of parmeter estimates (distinguished by the last index).
#
library(MASS) #mvrnorm()
x <- mvrnorm(n.iter * n.data, mu, sigma)
s <- array(sapply(1:n.iter, function(i) cov(x[(n.data*(i-1)+1):(n.data*i),])),
dim=c(n.dim, n.dim, n.iter))
m <-array(sapply(1:n.iter, function(i) colMeans(x[(n.data*(i-1)+1):(n.data*i),])),
dim=c(n.dim, n.iter))
return(list(m=m, s=s))
}
#
# Control the study.
#
set.seed(17)
n.dim <- 60
n.data <- 30 # Amount of data per iteration
n.iter <- 10^4 # Number of iterations
#n.parms <- choose(n.dim+2, 2) - 1
#
# Create a random mean vector.
#
mu <- rnorm(n.dim)
#
# Create a random covariance matrix.
#
#eigenvalues <- rgamma(n.dim, 1)
eigenvalues <- exp(-seq(from=0, to=3, length.out=n.dim)) # For comparability
u <- svd(matrix(rnorm(n.dim^2), n.dim))$u
sigma <- u %*% diag(eigenvalues) %*% t(u)
#
# Perform the simulation.
# (Timing is about 5 seconds for n.dim=60, n.data=30, and n.iter=10000.)
#
system.time(sim.data <- sim(n.data, mu, sigma, n.iter))
#
# Optional: plot the simulation results.
#
if (n.dim <= 6) {
par(mfcol=c(n.dim, n.dim+1))
tmp <- apply(sim.data$s, 1:2, hist)
tmp <- apply(sim.data$m, 1, hist)
}
#
# Compare the mean simulation results to the parameters.
#
par(mfrow=c(2,2))
plot(sigma, apply(sim.data$s, 1:2, mean), main="Average covariances")
abline(c(0,1), col="Gray")
plot(mu, apply(sim.data$m, 1, mean), main="Average means")
abline(c(0,1), col="Gray")
#
# Quantify the variability.
#
i <- lower.tri(matrix(1, n.dim, n.dim), diag=TRUE)
hist(sd.cov <- apply(sim.data$s, 1:2, sd)[i], main="SD covariances")
hist(sd.mean <- apply(sim.data$m, 1, sd), main="SD means")
#
# Display the simulation standard deviations for inspection.
#
sd.cov
sd.mean