PCA使用R中的栅格数据集

时间:2013-11-08 18:27:09

标签: r raster pca

我想要在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,但我真的很想了解为什么上述方法无效。

谢谢!

6 个答案:

答案 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)

rasterPCAhttp://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)