Задавая вопрос здесь, пожалуйста, не указывайте на файл в выпадающем списке, но включайте некоторые примеры данных, подобные этому:
library(raster)
b <- brick(system.file("external/rlogo.grd", package="raster"))
s <- stack(b, flip(b, "y"), setValues(raster(b), runif(ncell(b))))
names(s) <- paste0("var", 1:nlayers(s))
pca <- prcomp(values(s))
x <- predict(s, pca, index=1:4)
Вы создаете Xhat
путем подмножества ПК, но pca $ вращение имеет все переменные
round(pca$rotation[,1:nComp],1)
PC1 PC2 PC3 PC4
var1 -0.4 0.4 -0.4 0.4
var2 -0.4 0.4 -0.2 0.2
var3 -0.4 0.4 0.6 -0.6
var4 -0.4 -0.4 -0.4 -0.4
var5 -0.4 -0.4 -0.2 -0.2
var6 -0.4 -0.4 0.6 0.6
var7 0.0 0.0 0.0 0.0
И это имеет смысл, поскольку вы говорите, что хотите «восстановить исходные переменные из первых 4 ПК, поскольку меня интересует их пространственное распределение». Все переменные влияют на ПК.
То, что вы действительно хотите, это plot(x)
?
Вы используете плохой код для создания RasterBrick из Xhat
. Вы можете сделать это вместо:
Xhat <- pca$x[,1:nComp] %*% t(pca$rotation[,1:nComp])
Xhat <- scale(Xhat, scale = FALSE)
b <- brick(s, values=FALSE)
b <- setValues(b, Xhat)
b
#class : RasterBrick
#dimensions : 77, 101, 7777, 7 (nrow, ncol, ncell, nlayers)
#resolution : 1, 1 (x, y)
#extent : 0, 101, 0, 77 (xmin, xmax, ymin, ymax)
#crs : +proj=merc +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0
#source : memory
#names : var1, var2, var3, var4, var5, var6, var7
#min values : -184.32344039, -184.48714657, -193.05823803, -184.32341010, -184.48718831, -193.05827512, -0.01466663
#max values : 73.33872354, 70.38724578, 63.48912986, 73.33875039, 70.38723822, 63.48906605, 0.01193009
Сравните б и с
m <- cellStats(s, mean)
bb <- b + m
plot(bb, s)