有没有办法在两个栅格堆栈上应用 PCA(具有相同的变量)
Is there a way to apply PCA onto two raster stacks (w same variable)
我正在尝试 运行 R 中一些生物气候变量的主成分分析,特别是 worldclim.org 中生物气候变量的当前和未来预测。
问题在于prcomp只能使用一个rasterstack。我想让 prcomp 同时处理两个光栅堆栈。 Rasterstacks,具有完全相同的变量集(名称和范围),但单元格值不同。
我有一个迂回的方法来解决这个问题,就是移动未来栅格层的范围并将它们与当前栅格层合并为一组广泛的栅格层。但这给了我很多我希望与此一起使用的其他数据的投影问题。
我理解这不是很清楚,但基本上:PCA 两个具有相同变量、相同坐标的栅格堆栈,而无需移动范围。
谢谢!
编辑:
我不知道如何获取数据或创建示例数据,因此最初没有包含示例代码。会尽量在这里更清楚。
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
但是,我想同时在两个光栅堆栈上应用 PCA。根据当前和未来生物气候变量的变量构建 "PCA formula"。
像这样...
pca <- prcomp(rasC, rasF, scale = T)
CurPCs <- predict(rasC, pca)
FutPCs <- predict(rasF, pca)
希望这更清楚!
致post遇到类似问题的人。
我找到了这个问题的简单答案。
prcomp
不直接作用于栅格本身,而是作用于栅格中的(通常是随机的)点矩阵。
为了合并两个栅格堆栈的 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。
没想到还有这么一步,不过我觉得至少解决了!
我正在尝试 运行 R 中一些生物气候变量的主成分分析,特别是 worldclim.org 中生物气候变量的当前和未来预测。
问题在于prcomp只能使用一个rasterstack。我想让 prcomp 同时处理两个光栅堆栈。 Rasterstacks,具有完全相同的变量集(名称和范围),但单元格值不同。
我有一个迂回的方法来解决这个问题,就是移动未来栅格层的范围并将它们与当前栅格层合并为一组广泛的栅格层。但这给了我很多我希望与此一起使用的其他数据的投影问题。
我理解这不是很清楚,但基本上:PCA 两个具有相同变量、相同坐标的栅格堆栈,而无需移动范围。
谢谢!
编辑: 我不知道如何获取数据或创建示例数据,因此最初没有包含示例代码。会尽量在这里更清楚。
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
但是,我想同时在两个光栅堆栈上应用 PCA。根据当前和未来生物气候变量的变量构建 "PCA formula"。 像这样...
pca <- prcomp(rasC, rasF, scale = T)
CurPCs <- predict(rasC, pca)
FutPCs <- predict(rasF, pca)
希望这更清楚!
致post遇到类似问题的人。 我找到了这个问题的简单答案。
prcomp
不直接作用于栅格本身,而是作用于栅格中的(通常是随机的)点矩阵。 为了合并两个栅格堆栈的 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。 没想到还有这么一步,不过我觉得至少解决了!