访问 R 自组织映射码本向量

Accessing R Self Organizing Map Codebook Vectors

我正在努力使用 SOM 来帮助分析天气预报模型集合的可变性。为此,请访问特定地理区域的 20 个整体全球天气预报模型。我将 20 x Nlat x Nlon 矩阵转换为 20 x Nlat*Nlon 矩阵,将其呈现给 Kohonen 包 som 函数。然后我寻求访问 som "codebook vector" 输出并将其转换回纬度经度网格。但是,我在这一步收到一条错误消息。

我收到的错误信息是: 'Error in var.som$codes[i, ] : incorrect number of dimensions.' 在这种情况下,var.som 是 Kohonen 对象。我从 N = 1:Nsom 开始循环,其中 Nsom 是在调用 som 函数时指定的 "maps" 的数量。

var.som 的属性数据表示列表 var.som$codes 的大小是 "num [1:4, 1:500]",建议二维,这就是为什么我认为我的代码应该工作。我尝试了不同的排列来访问列表数据,但 none 有效。 IE。 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  

尝试:var.vecc[,i]<-var.som$codes[[1]][i,]