显着特征值
您可以使用某种模拟来计算特征值超过某个限制的概率,并以此为基础进行选择。在 R-packagepsych中,有一个函数可以执行此操作(如下所示)。
如果您假设来自高斯分布总体的样本没有相关性,那么您应该期待一个所有点/特征值都在弱斜率上的碎石图。(我不知道这个斜率的公式,但你可以通过模拟计算它,或者基于下面完成的分布,或者通过某种自举)
应用于你的情节
如果我们松散地应用这个你的情节(我没有数据,但我们可以想象这条线会是怎样的):你的第 4 个特征值在这个弱斜率/线上,并且瓦砾和陡峭之间有明显的区别爬坡道。所以可能第四个特征值不是很有意义(或者方差只是不显着/不明显或适当缩放;解释 PCA 特征值的先决条件是任何潜在的方差来源都将具有相同的比例)。第 4 个组件确实是瓦砾的一部分。第 4 个特征值与第 5 个特征值几乎没有区别。因此,任何包含 4-th 的论点都应该与包含 5-th 一样强大。
然而,意义往往不是问题
m vs. m-1 问题更多是当碎石图不那么明显时的情况。但是,在那种不太清楚的情况下,问题不在于组件是否具有(统计)显着高的特征值(更多关于下面的示例)。但相反,关于效应大小是否足够大或占主导地位。
在这种情况下,“诀窍”是寻找最显着的特征值,然后加 1(只是为了确定。我猜。我不太了解这个规则。但无论如何它不是一个非常严格的规则。)。
心理包和手动绘图的示例
下面的 R 代码为Harman 的示例 7.4生成下面的碎石图。
左侧的图是使用包中的单个函数创建fa.Parallel的psych。该图给出了碎石图以及一条与模拟的特征值相关的线,其中高斯分布数据具有单位矩阵作为协方差。
右侧的绘图是手动创建的。您可以使用代码(我希望它足够直观)来弄清楚它是如何工作的。
在这个图中,我对特征值使用了稍微不同的度量。我根据所有较低特征值的平均值对特征值进行了缩放。这样做的原因是由于存在更高的特征值,正在考虑的特征值将相对低于用于比较的没有这些更高特征值的随机高斯数据。
结果是更多的点在线上并且似乎很重要。那不是很多吗?好吧,也许不是。比较是使用完全球形的数据模型进行的,并且方差在所有方向上都相等。但在实践中,数据在方差/特征值上有一些变化并不奇怪。即使组间不存在导致方差增加的结构、聚类或其他方差,那么人们仍然可能认为所有方向的噪声都不相同。

set.seed(1)
psych::fa.parallel(Harman74.cor$cov, n.obs = 145, fa = "pc",
main = "plot using psych package")
### compute eigenvalues for Harman74 data
### A correlation matrix of 24 psychological tests given
### to 145 seventh and eight-grade children in a Chicago
### suburb by Holzinger and Swineford
ev <- eigen(Harman74.cor$cov)$values
### simulate normal distributed data
### and compute the eigen values
sim_eigen <- function(n_var,n_points) {
x <- matrix(rnorm(n_var*n_points), ncol = n_var)
m <- cov(x)
sim_ev <- eigen(m)$values
return(sim_ev)
}
### relative numbers
### compute the eigenvalue relative to the mean of the lower values
f_rel <- function(x_in) {
l <- length(x_in)
x_out <- sapply(1:l, FUN = function(k) {
x_in[k]/mean(x_in[k:l])
})
return(x_out)
}
### simulate 1000 times
sim <- replicate(1000,f_rel(sim_eigen(24,145)))
### compute mean and upper and lower 90% interval
ev_mu <- rowMeans(sim) ### compute the mean of thousand simulations
ev_up <- sapply(1:length(ev_mu), FUN = function(k) {
quantile(sim[k,], probs = 0.95)
})
ev_low <- sapply(1:length(ev_mu), FUN = function(k) {
quantile(sim[k,], probs = 0.05)
})
### plot alternative
plot(f_rel(ev), main = "plot using alternative measure", col = 4, pch = 4, type = "b",
xlab = "Component Number",
ylab = "eigen value relative to smaller eigenvalues")
lines(ev_mu)
lines(ev_up, col = 1, lty = 2)
lines(ev_low, col = 1, lty = 2)
下面是我们自己生成数据的模拟。现在我们根据高斯分布生成数据。
x <- MASS::mvrnorm(145, mu = rep(0,24),
Sigma = diag(c(8,2,2,1.3,rep(1,20))))
cm <- cov(x)
ev <- eigen(cm)$values
结果是您可以在模拟带宽内更接近地看到特征值。特征值为 8、2、2 的向量被挑选出来。特征值为 1.3 的向量太难了。

概括
上面的例子表明你可能会得到一个很好的清晰的碎石图,就像最后一个图一样。但是,只有当除了少数向量/分量(您希望检测和探索)之外所有特征值都相同时,才会出现这种情况。
在许多实际情况下,特征值/方差相等的假设在任何情况下都是无效的。碎石地块看起来并不完美,瓦砾和陡峭的山丘之间没有明显的边界。在这种情况下对碎石图的分析并不是要找到具有统计意义的特征值。但相反,碎石图是为了查看不同组件的重要性/方差的分布。
从技术上讲,所有组件都可能很重要。PCA 的重点不是确定哪些是重要的,而是为了数据缩减的目的找到一些务实的临界值。如果清晰,碎石图可以帮助您对不同的组件进行分类,并确定一组不同的大值。