【发布时间】:2015-06-25 17:43:33
【问题描述】:
我正在尝试使用带替换的重采样(如引导程序)来生成主成分分析的置信区间。我正在使用 iris 数据集的前 4 列:
prcomp 函数产生以下输出:
> mydf = iris[1:4]
> print(prcomp(mydf))
Standard deviations:
[1] 2.0562689 0.4926162 0.2796596 0.1543862
Rotation:
PC1 PC2 PC3 PC4
Sepal.Length 0.36138659 -0.65658877 0.58202985 0.3154872
Sepal.Width -0.08452251 -0.73016143 -0.59791083 -0.3197231
Petal.Length 0.85667061 0.17337266 -0.07623608 -0.4798390
Petal.Width 0.35828920 0.07548102 -0.54583143 0.7536574
使用带替换的重采样:
> times = 1000
> ll = list()
> for(i in 1:times) {
+ tempdf = mydf[sample(nrow(mydf), replace = TRUE), ]
+ ll[[length(ll)+1]] = prcomp(tempdf)$rotation
+ }
>
> dd = data.frame(apply(simplify2array(ll), 1:2, mean))
> print(dd)
PC1 PC2 PC3 PC4
Sepal.Length 0.005574165 -0.039480258 0.044537991 0.007778055
Sepal.Width -0.002587333 -0.040273812 -0.050793200 -0.005473271
Petal.Length 0.015681233 0.010952361 -0.005769051 -0.011351172
Petal.Width 0.006513656 0.008296928 -0.041805210 0.019109323
确定下置信区间:
> ddlower = data.frame(apply(simplify2array(ll), 1:2, quantile, probs=0.025))
> print(ddlower)
PC1 PC2 PC3 PC4
Sepal.Length -0.3859257 -0.7274809 -0.6560139 -0.3807826
Sepal.Width -0.1127749 -0.7907801 -0.6818251 -0.3941001
Petal.Length -0.8633386 -0.2058064 -0.1333520 -0.4919584
Petal.Width -0.3702979 -0.1328146 -0.6203322 -0.8088710
确定上置信区间:
> ddupper = data.frame(apply(simplify2array(ll), 1:2, quantile, probs=0.975))
> print(ddupper)
PC1 PC2 PC3 PC4
Sepal.Length 0.3860431 0.7250412 0.6632126 0.3831889
Sepal.Width 0.1111863 0.7993649 0.6758156 0.3987939
Petal.Length 0.8638549 0.2106540 0.1318556 0.4915670
Petal.Width 0.3721362 0.1510708 0.6246988 0.8083421
我发现加载值非常不同。此外,所有变量和分量的置信区间都在 0 左右。我还检查了其他(大型)数据集,结果非常相似。从这些置信区间来看,没有任何负载与 0 有显着差异。代码中显然存在一些错误,但我似乎找不到它。感谢您的帮助。
【问题讨论】:
-
嗯,你不是没有提取出
"+ ll[[length(ll)+1]] = prcomp(tempdf)$rotation"行中的$rotation的第一列吗? (认为前 1000 个 princomps 的平均值应该与 prcomp_rotation 的原始计算非常相似) -
OP 正在为 1000 个引导重采样中的每一个中的每个变量捕获特征向量(加载)的 整个 矩阵。后面的命令然后计算每个特征向量的各个元素的百分置信区间。
-
@GottfriedHelms :这是我的问题。由于 Gavin Simpson 的回答中描述的符号问题,平均值接近 0。
-
@rnso:啊,我明白了。现在这似乎清除了。令人高兴的是,我自己的例程(在我的小型“袖珍”矩阵计算器 MatMate 中)似乎可以很好地通过实现给出归一化的符号......(我通过 svd-rotation 复制了 R:
prcomp-procedure(根据其手册)在协方差矩阵上,并为过程gettrans(cov,"pca")实现了符号规范化,显然足以满足这个实际情况 -
啊,好吧,我对 R 还不熟悉。然后在 1000 个样本的每个实验中对特征向量的符号进行归一化(例如,对于项目
sepal.length的所有主成分都是非负的)就足够了(这只是对我删除的先前评论的文本更正)跨度>