1

我正在努力使用 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  
4

1 回答 1

0

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

于 2017-12-19T01:15:52.820 回答