有没有办法在两个栅格堆栈上应用PCA(具有相同的变量)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有办法在两个栅格堆栈上应用PCA(具有相同的变量)相关的知识,希望对你有一定的参考价值。

我试图对R中的一些生物气候变量运行PCA,特别是来自worldclim.org的生物气候变量的当前和未来预测。

问题在于prcomp只能使用一个rasterstack。我想让prcomp同时在两个rasterstack上工作。 Rasterstacks,具有完全相同的变量集(名称和范围),但具有不同的单元格值。

我确实有一个迂回方法来解决这个问题,即改变未来栅格图层的范围,并将它们与当前栅格图层合并为一组广泛的栅格图层。但这给了我很多与其他数据的投影问题,我希望与此一起使用。

我理解这并不完全清楚,但基本上:PCA两个具有相同变量的rasterstacks,具有相同的坐标,而不必移位范围。

谢谢!

编辑:我无法弄清楚如何获取数据或创建示例数据,因此最初没有包含示例代码。将在这里尝试更清楚。

filesC # location of bioclimate files for current
[1] "bio01.asc" "bio02.asc" "bio03.asc" "bio04.asc" "bio05.asc"
filesF # location of bioclimate files for the future
[1] "bio01.asc" "bio02.asc" "bio03.asc" "bio04.asc" "bio05.asc"
# note they have the exact same variables.

rasC <- stack(filesC)
rasF <- stack(filesF)
rasC@extent
#class       : Extent 
#xmin        : 116.95 
#xmax        : 126.6 
#ymin        : 4.65 
#ymax        : 21.11667 
rasF@extent
#class       : Extent 
#xmin        : 116.95 
#xmax        : 126.6 
#ymin        : 4.65 
#ymax        : 21.11667 
# and exact same extent

所以目前我正在这样做。

pcaC <- prcomp(rasC, scale = T)
FutPCs <- predict(rasF, pcaC) 
# creating PCs of rasF based on the pca from rasC

但是,我想同时在两个rasterstacks上应用PCA。根据当前和未来生物气候变量的变量构建“PCA公式”。像这样......

pca <- prcomp(rasC, rasF, scale = T)
CurPCs <- predict(rasC, pca)
FutPCs <- predict(rasF, pca)

希望这更清楚!

答案

对于遇到类似问题的人来说。我找到了这个问题的简单答案。

prcomp

不直接在栅格本身上工作,而是使用栅格中的(通常是随机的)点矩阵。为了合并两个rasterstacks的PCA分析,我只是从每个光栅堆栈中包含等分的点并将它们绑定在一起。

rasC <- stack(rasC)
rasF <- stack(rasF)

srC <- sampleRandom(rasC, 10000)
srF <- sampleRandom(rasF, 10000)

srCF <- rbind(srC,srF)
pcaCF <- prcomp(srCF,scale=T)

从那里,我可以根据两个数据集的组合pca预测新PC。没有意识到有这样一个步骤,但至少我认为它已经解决了!

以上是关于有没有办法在两个栅格堆栈上应用PCA(具有相同的变量)的主要内容,如果未能解决你的问题,请参考以下文章

R中栅格堆栈的无监督随机森林分类

将光栅堆栈投影为动画或 GIF 传单

有没有办法合并两个具有相同键的 JS 对象? [复制]

具有分类数据的栅格地图的图例

制作不同范围的栅格堆栈

有没有办法在颤振应用程序中使用firebase查找具有相同孩子名字的孩子的总数?