我想要在PCA中处理几个大型栅格(以生成摘要栅格)。 我看过几个例子,人们似乎只是简单地调用prcomp或princomp。但是,当我这样做时,我收到以下错误消息:
Error in as.vector(data): no method for coercing this S4 class to a vector
示例代码:
files<-list.files() # a set of rasters
layers<-stack(files) # using the raster package
pca<-prcomp(layers)
我尝试使用栅格砖代替堆栈,但这似乎不是问题。我需要什么方法来提供命令,以便它可以将栅格数据转换为矢量格式?我知道有一些方法可以对栅格进行采样并从中运行PCA,但我真的很想了解为什么上述方法无效。
谢谢!
答案 0 :(得分:3)
回答我自己的问题:我最终做了一些稍微不同的事情:我没有使用每个栅格单元作为输入(非常大的数据集),我拿了一个点的样本,运行了PCA,然后保存了输出模型,以便我可以为每个网格单元做出预测...也许不是最好的解决方案,但它有效:
rasters <- stack(myRasters)
sr <- sampleRandom(rasters, 5000) # sample 5000 random grid cells
# run PCA on random sample with correlation matrix
# retx=FALSE means don't save PCA scores
pca <- prcomp(sr, scale=TRUE, retx=FALSE)
# write PCA model to file
dput(pca, file=paste("./climate/", name, "/", name, "_pca.csv", sep=""))
x <- predict(rasters, pca, index=1:6) # create new rasters based on PCA predictions
答案 1 :(得分:3)
rasterPCA
包http://bleutner.github.io/RStoolbox/rstbx-docu/rasterPCA.html
RStoolbox
个功能
例如:
library('raster')
library('RStoolbox')
rasters <- stack(myRasters)
pca1 <- rasterPCA(rasters)
pca2 <- rasterPCA(rasters, nSamples = 5000) # sample 5000 random grid cells
pca3 <- rasterPCA(rasters, norm = FALSE) # without normalization
答案 2 :(得分:1)
上述方法不能正常工作,因为prcomp不知道如何处理栅格对象。它只知道如何处理向量,并且强制向量不起作用,因此出错。
您需要做的是将每个文件读入矢量,并将每个栅格放在矩阵的列中。然后,每一行将是单个空间位置处的时间序列值,并且每列将是特定时间步长处的所有像素。请注意,此方法不需要精确的空间坐标。此矩阵用作prcomp
的输入。
可以使用readGDAL
读取文件,并使用as.data.frame
将空间数据投射到data.frame。
答案 3 :(得分:1)
这是一个有效的解决方案:
library(raster)
filename <- system.file("external/rlogo.grd", package="raster")
r1 <- stack(filename)
pca<-princomp(r1[], cor=T)
res<-predict(pca,r1[])
显示结果:
r2 <- raster(filename)
r2[]<-res[,1]
plot(r2)
答案 4 :(得分:0)
另一种选择是从光栅堆栈中提取vales,即:
rasters <- stack(my_rasters)
values <- getValues(rasters)
pca <- prcomp(values, scale = TRUE)
答案 5 :(得分:0)
这是另一种扩展@Daniel提出的getValues方法的方法。结果是栅格堆栈。索引(idx)引用非NA位置,以便考虑NA值。
library(raster)
r <- stack(system.file("external/rlogo.grd", package="raster"))
r.val <- getValues(r)
idx <- which(!is.na(r.val))
pca <- princomp(r.val, cor=T)
ncomp <- 2 # first two principle components
r.pca <- r[[1:ncomp]]
for(i in 1:ncomp) { r.pca[[i]][idx] <- pca$scores[,i] }
plot(r.pca)