如何在 R 中使用 netcdf 数据进行 PCA

Posted

技术标签:

【中文标题】如何在 R 中使用 netcdf 数据进行 PCA【英文标题】:How to do a PCA with netcdf data in R 【发布时间】:2014-10-16 14:52:25 【问题描述】:

我在 R 中有以下 netcdf 文件:

"file oceandata.nc has 2 dimensions:"
"lon   Size: 2160"
"lat   Size: 900"
"------------------------"
"file oceandata.nc has 14 variables:"
"float bio1[lon,lat]  Longname:bio1: Annual Mean Temp Missval:1e+30"
"float bio4[lon,lat]  Longname:bio4: Temp Seasonality (standard deviation * 100) Missval:1e+30"
"float bio8[lon,lat]  Longname:bio8: Mean Temp of Wettest Quarter Missval:1e+30"
"float bio9[lon,lat]  Longname:bio9: Mean Temp of Driest Quarter Missval:1e+30"
"float bio10[lon,lat]  Longname:bio10: Mean Temp of Warmest Quarter Missval:1e+30"
"float bio11[lon,lat]  Longname:bio11: Mean Temp of Coldest Quarter Missval:1e+30"
"float bio12[lon,lat]  Longname:bio12: Annual Precipitation Missval:1e+30"
"float bio13[lon,lat]  Longname:bio13: Precipitation of Wettest Month Missval:1e+30"
"float bio14[lon,lat]  Longname:bio14: Precipitation of Driest Month Missval:1e+30"
"float bio15[lon,lat]  Longname:bio15: Precipitation Seasonality (coefficient of variation) Missval:1e+30"
"float bio16[lon,lat]  Longname:bio16: Precipitation of Wettest Quarter Missval:1e+30"
"float bio17[lon,lat]  Longname:bio17: Precipitation of Driest Quarter Missval:1e+30"
"float bio18[lon,lat]  Longname:bio18: Precipitation of Warmest Quarter Missval:1e+30"
"float bio19[lon,lat]  Longname:bio19: Precipitation of Coldest Quarter Missval:1e+30"

我想对文件中的 14 个变量执行 PCA,但不确定如何执行此操作,或者是否需要将数据转换为其他格式才能执行此操作。

到目前为止我已经完成了(下面的错误消息):

ocean <- open.ncdf("oceandata.nc")

bio1 <- get.var.ncdf(nc=ncdf, varid="bio1")

bio4 <- get.var.ncdf(nc=ncdf, varid="bio4")

bio8 <- get.var.ncdf(nc=ncdf, varid="bio8")

bio9 <- get.var.ncdf(nc=ncdf, varid="bio9")

dim(bio1)

[1] 2160 900

class(bio1)

[1]“矩阵”

oceanvars <- cbind(bio1,bio4, bio8, bio9)

colnames(oceanvars) <- c("bio1", "bio4", "bio8", "bio9")

colnames&lt;-(*tmp*, value = c("bio1", "bio4", "bio8", "bio9" 中的错误:'dimnames' [2] 的长度不等于数组范围

pairs(oceanvars)

plot.new() 中的错误:图边距太大

pca1 <- princomp(oceanvars, scores=TRUE, cor=TRUE)

princomp.default 中的错误(oceanvars,scores = TRUE,cor = TRUE):“princomp”只能用于比变量更多的单位

任何建议将不胜感激!

【问题讨论】:

【参考方案1】:

你为什么假设cbinding 4 个矩阵,每个矩阵有 900 列,会产生一个有 4 列的矩阵对象,允许将 c("bio1", "bio4", "bio8", "bio9") 分配为列名。

据我了解,您有四个变量 Annual Mean TempTemp SeasonalityMean Temp of Wettest QuarterMean Temp of Driest Quarter,总共有 1944000 个空间对象要由 PCA 分析。

不幸的是,您没有提供可重现的示例,而是通过创建oceanvars

oceanvars <- cbind( c(bio1), c(bio4), c(bio8), c(bio9) )

应该已经成功了。原因是,c() 将一个矩阵融合为一个简单的向量。

一个更通用和更简洁的过程将涉及到melt 你的矩阵到 3 列 data.frames 或者在这个大小甚至更好的data.tables 然后merge 它们通过lonlat的组合然后将值列作为矩阵提供给princomp

【讨论】:

以上是关于如何在 R 中使用 netcdf 数据进行 PCA的主要内容,如果未能解决你的问题,请参考以下文章

从 NetCDF 中提取数据

如何从 R 中的 netCDF 文件中提取变量名?

如何使用 R 中的纬度/经度边界从 netCDF 文件中获取子集

在 R 中创建多维 NetCDF

使用 R 估计 NetCDF 数据的每月气候学

R语言使用caret包的preProcess函数进行数据预处理:对所有的数据列进行主成分分析PCA(principal components analysis)设置method参数为pca