访问R自组织地图码簿向量

时间:2017-12-19 00:48:45

标签: r self-organizing-maps

我正在努力使用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 $代码的帮助和指导,我们非常感谢。

# 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  

1 个答案:

答案 0 :(得分:0)

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