現在、私のコードは[worldclim] [1]データセットから気候変数を抽出するのに時間がかかりすぎています。リンクから気候データをダウンロードして、種の分布ポリゴンの最高気温を見つけ、CSVファイルとしてディレクトリに保存したいと思います。
コードは機能していますが、時間がかかりすぎます(たとえば、私のPCでは3〜4日)。誰かが私のコードのパフォーマンスを改善する方法を提案できますか?
私のコードはここにあります:
# download the climate dataset and unzip. I can download and unzip this into my pc. Please suggest me on main codes for improvement
download.file("http://biogeo.ucdavis.edu/data/climate/cmip5/30s/mi85tx50.zip", destfile = "E://ClimateDataOutputs//MIROC-ESM-CHEM_rcp85TX", mode="wb")
unzip("E://ClimateDataOutputs//MIROC-ESM-CHEM_rcp85TX")
# Codes for improvement
# load required packages
require(sp)
require(rgdal)
require(raster)
require(lsr)
require(maptools)
# For Bioclim - Need to project species polygons
projection <- CRS ("+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs")
polygons <- readShapePoly("F:\\9. Other projects\\All projected maps\\AllP.shp", proj4string = projection)
polygons$BINOMIAL <- as.character(polygons$BINOMIAL)
names=c(polygons$BINOMIAL)
stats_out<- data.frame(matrix(NA, ncol = 4, nrow = 579))
colnames(stats_out)<-c("BINOMIAL", "AAD", "mean", "obs")
stats_out[,1]<-names
# iterate over species polygons
for (i in 1:579) {
poly<-polygons[i,]
print(poly$BINOMIAL)
data_out<-data.frame(matrix(NA, ncol = 1))
colnames(data_out)<-c("MaxTemp2050rcp85_MIROC_ESM_CHEM")`
for (j in 1:12) {
filename<-c(paste("E:\\ClimateDataOutputs\\mi85tx50",j,".tif", sep=""))
##print(filename)
grid<-raster(filename)
##plot(grid)
##plot(poly, add=TRUE)
data<-extract(grid, poly)
data1<-as.data.frame(data)
colnames(data1)<-c("MaxTemp2050rcp85_MIROC_ESM_CHEM")
data_out= rbind(data_out,data1)
}
M<-mean(data_out$MaxTemp2050rcp85_MIROC_ESM_CHEM, na.rm=TRUE)
AAD<-aad(data_out$MaxTemp2050rcp85_MIROC_ESM_CHEM, na.rm=TRUE)
stats_out$AAD[i]<-AAD
stats_out$mean[i]<-M
stats_out$obs[i]<-nrow(data_out)
}
print(stats_out)
write.csv(stats_out, "E://ClimateDataOutputs//MaxTemp2050rcp85_MIROC_ESM_CHEM_AAD.csv")
ラスターを積み上げてみませんか?
stack(list.files("E:\\ClimateDataOutputs","mi85tx50",full.names=T))
data<-extract(grid, poly)
それは役立つかもしれません
他のオプション、行:
data_out= rbind(data_out,data1)
非常に非効率的です。ループ内では、最初にオブジェクトを準備して、次のように埋める方が常に適切です。data_out[j,] <- data1
最後に、少し難しいですが、「j」ループを関数にして、parLapply
すべてのポリゴンで分析を並列化する方法を見つけてください。
また、この種の質問system.time
では、ボトルネックがどこにあるかをより正確に把握できるように、ステートメントを追加することをお勧めします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加