如何在 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<-
(*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】:你为什么假设cbind
ing 4 个矩阵,每个矩阵有 900 列,会产生一个有 4 列的矩阵对象,允许将 c("bio1", "bio4", "bio8", "bio9") 分配为列名。
据我了解,您有四个变量 Annual Mean Temp
、Temp Seasonality
、Mean Temp of Wettest Quarter
和 Mean 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
它们通过lon
和lat
的组合然后将值列作为矩阵提供给princomp
。
【讨论】:
以上是关于如何在 R 中使用 netcdf 数据进行 PCA的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 R 中的纬度/经度边界从 netCDF 文件中获取子集
R语言使用caret包的preProcess函数进行数据预处理:对所有的数据列进行主成分分析PCA(principal components analysis)设置method参数为pca