我正在努力使用 SOM 来帮助分析天气预报模型集合的可变性。为此,请访问特定地理区域的 20 个集合全球天气预报模型。我将 20 x Nlat x Nlon 矩阵转换为 20 x Nlat*Nlon 矩阵,并将其呈现给 Kohonen 包 som 函数。然后我寻求访问 som “码本向量”输出并将其转换回纬度经度网格。但是,我在这一步收到了一条错误消息。
我收到的错误消息是:“var.som$codes[i, ] 中的错误:维数不正确。” 在这种情况下,var.som 是 Kohonen 对象。我从 N = 1:Nsom 循环,其中 Nsom 是调用 som 函数时指定的“映射”数。
var.som 的属性数据表明列表 var.som$codes 的大小是“num [1:4, 1:500]”,暗示了两个维度,这就是我认为我的代码应该可以工作的原因。我尝试了不同的排列来访问列表数据,但没有一个工作。即 var.som$codes[1] 和 var.som$codes[[1]] 但它们不能解决问题。var.som$codes[1,1] 产生 NULL。
在下面的 R 脚本中,我已将过程简化为仅基本步骤。随机数生成器取代了对天气模型数据的访问。在代码中,我指出了错误发生的位置以及错误消息是什么。
感谢您提供有关如何一次访问 var.som$codes 一个码本向量的帮助和指导。
# An R script that provides an example of using a Self Organizing Map to calucate a SOM from latitude/longitude
# data. An error occurs fails accessing the SOM data vector codes.
library("kohonen")
# Set a few parameters
Nlon <- 20 # Number of longitude points
Nlat <- 25 # Number of latitude points
Nens <- 20 # number of ensemble members
Nsom <- 4 # number of "maps" in SOM
t2m.en <- as.list(rep(0,Nens))
# Generate Nlon * Nlat random numbers for Nens ensembles
for (i in 1:Nens) {
t2m.en[[i]] <- runif(Nlon*Nlat, -5, 5)
}
#array containing ensemble data
t2m.ens <- array(unlist(t2m.en),dim=c(20,Nlon,Nlat))
t2m.vec <- matrix(t2m.ens, nrow=20, ncol=Nlat*Nlon, byrow=TRUE)
# remove the column mean from each column of data (i.e. each grid point)
t2m.scaled <- apply(t2m.vec, 2, scale, scale=FALSE, center=TRUE)
rm(t2m.en)
# LOOP OVER THE VARIABLES TO PLOT
# Conduct the SOM analysis
var.som <- som(t2m.scaled, grid = somgrid(2,2, "rectangular"))#, keep.data=TRUE))
var.vecc = mat.or.vec(Nlat*Nlon, Nsom)
#populate var.vecc with the SOM output maps
for (i in 1:Nsom) {
print(i)
## THIS IS WHERE THE ERROR IS
var.vecc[,i] <- var.som$codes[i,]
## The Error Message is:
## Error in var.som$codes[i, ] : incorrect number of dimensions
}
#var.som$codes[1]
# Plot data from var.vecc on a map