文章目錄
- 一、相關package介紹
- 1.1 dismo 包
- 1.2 raster包
- 1.3 常見問題與解決
- 二、代碼示例
🟢🟠先看:【maxENT】最大熵模型(Maximum Entropy Model)介紹與使用(maxENT軟件)
ASCII文件太大,使用R語言直接輸入環境的柵格文件。
一、相關package介紹
1.1 dismo 包
專門用于物種分布建模(Species Distribution Modeling, SDM),提供與MaxEnt模型的接口,支持數據預處理、模型訓練、預測及評估。
核心函數詳解
1. maxent()
功能: 訓練MaxEnt模型(基于Java實現)。
參數:
maxent(x, p, removeDuplicates=TRUE, path, args, ...)
-
x
- 類型:
RasterStack
或RasterBrick
- 作用: 包含環境變量(如溫度、海拔)的多層柵格數據,作為模型輸入。
- 類型:
-
p
- 類型: 兩列數據框(
data.frame
) - 作用: 物種存在點的坐標,列名需為
x
(經度)和y
(緯度)。 - 示例:
presence_points <- data.frame(x = c(100, 101), y = c(30, 31))
- 類型: 兩列數據框(
-
removeDuplicates
- 類型: 邏輯值(
TRUE
/FALSE
) - 默認:
TRUE
- 作用: 是否移除重復坐標點,避免過擬合。
- 類型: 邏輯值(
-
path
- 類型: 字符串
- 作用: 保存MaxEnt輸出文件的目錄路徑(包括HTML報告、模型參數、預測結果圖)。
- 示例:
path = "G:/sdm_output"
-
args
- 類型: 字符向量
- 作用: 控制MaxEnt模型行為的命令行參數,常用選項:
betamultiplier
: 正則化系數(默認1),增大可簡化模型(防過擬合)。linear
/quadratic
/product
/hinge
/threshold
: 啟用(TRUE
)或禁用(FALSE
)特定特征類型。linear
: 線性特征(適合單調響應)hinge
: 鉸鏈特征(適合非線性響應)
threads
: 使用的CPU線程數(加速計算,如threads=12
)。responsecurves
: 是否生成響應曲線(TRUE
/FALSE
)。
- 示例:
args = c("betamultiplier=2", "hinge=FALSE", "threads=8")
2. predict()
功能: 應用訓練好的模型預測物種分布概率。
參數:
predict(object, x, ext=NULL, filename="", progress='text', ...)
-
object
- 類型:
MaxEnt
模型對象 - 作用: 訓練好的MaxEnt模型。
- 類型:
-
x
- 類型:
RasterStack
- 作用: 輸入的環境變量柵格數據(需與訓練數據層數、名稱一致)。
- 類型:
-
filename
- 類型: 字符串
- 作用: 直接保存預測結果到指定路徑(支持.tif、.grd格式)。
- 示例:
filename = "G:/prediction.tif"
-
progress
- 類型: 字符串
- 作用: 顯示進度條(
'text'
或'window'
)。
1.2 raster包
處理柵格數據(如地理空間柵格圖像),支持數據讀寫、裁剪、計算、統計及可視化。
核心函數詳解
1. rasterOptions()
功能: 全局配置柵格數據處理參數。
常用參數:
rasterOptions(maxmemory=1e+09, tmpdir="path/to/temp", chunksize=1e+08)
-
maxmemory
- 類型: 數值
- 作用: 設置R可使用的最大內存量(單位:字節)。
- 示例:
maxmemory=10e9
表示分配10GB內存。
-
tmpdir
- 類型: 字符串
- 作用: 指定臨時文件存儲目錄(需位于高速存儲設備以提升性能)。
- 示例:
tmpdir = "G:/temp"
-
chunksize
- 類型: 數值
- 作用: 定義分塊處理數據的大小,優化大文件處理速度。
2. stack()
功能: 將多個柵格文件合并為RasterStack
對象(多層柵格)。
參數:
stack(..., bands=NULL, quick=FALSE)
-
...
- 類型: 字符向量或柵格文件路徑
- 作用: 輸入待合并的柵格文件列表。
- 示例:
stack("G:/climate/temp.tif", "G:/climate/precip.tif")
-
bands
- 類型: 整數
- 作用: 選擇多波段文件中的特定波段(默認為所有波段)。
3. writeRaster()
功能: 將柵格數據寫入文件(如GeoTIFF)。
參數:
writeRaster(x, filename, format="GTiff", overwrite=FALSE, ...)
-
x
- 類型:
RasterLayer
或RasterStack
- 作用: 待保存的柵格數據。
- 類型:
-
filename
- 類型: 字符串
- 作用: 輸出文件路徑及名稱。
- 示例:
filename = "G:/output/prediction.tif"
-
format
- 類型: 字符串
- 作用: 指定文件格式(如
"GTiff"
、"HFA"
(Erdas Imagine))。
-
overwrite
- 類型: 邏輯值
- 作用: 是否覆蓋同名文件(默認
FALSE
)。
4. predict()
功能: 與dismo
包中的predict()
類似,但更通用,支持多種模型(如GLM、隨機森林)。
參數:
predict(object, newdata, filename="", ...)
newdata
- 類型:
RasterStack
- 作用: 輸入的環境變量柵格數據。
- 類型:
1.3 常見問題與解決
-
Java內存不足
- 錯誤提示:
Java.lang.OutOfMemoryError
- 解決:
options(java.parameters = "-Xmx20g") # 分配更大內存
- 錯誤提示:
-
臨時文件占用過大
- 現象: 臨時目錄爆滿導致程序崩潰。
- 解決:
rasterOptions(tmpdir = "D:/fast_disk/temp") # 指定大容量高速存儲
-
預測結果全為NA
- 原因: 環境變量柵格與存在點坐標的空間參考不一致。
- 解決:
crs(env_stack) <- crs(presence_points) # 檢查并統一坐標系
二、代碼示例
只是示例,你自己問AI即可。
options(java.parameters = "-Xmx10g") # 分配10GB內存給Javalibrary(dismo)
library(raster)rasterOptions(maxmemory = 10e9) # 10GB內存
rasterOptions(tmpdir = "xxxxx") # 設置高速存 儲上的臨時目錄# 讀取環境變量數據
env_files <- list.files(path = "xxx",pattern = ".tif$",full.names = TRUE
)
env_stack <- stack(env_files)# 讀取物種存在點
species_data <- read.csv("xxx點位_albers.csv")
presence_points <- species_data[, c("x", "y")]# 創建列表存儲每次的預測結果
prediction_list <- list()# 一次為例
for (i in 1:1) {# 設置不同的隨機種子確保數據分割不同set.seed(i)# 分割訓練集和測試集 (80/20)train_indices <- sample(1:nrow(presence_points), 0.8 * nrow(presence_points))train_points <- presence_points[train_indices, ]test_points <- presence_points[-train_indices, ]# 訓練MaxEnt模型maxent_model <- maxent(x = env_stack,p = train_points,removeDuplicates = TRUE,path = paste0("xxx/run_", i), # 為每次運行創建獨立文件夾args = c("betamultiplier=1","linear=TRUE","quadratic=TRUE","product=TRUE","hinge=TRUE","threshold=FALSE","threads=12"))# 預測分布概率prediction_map <- predict(maxent_model,env_stack,progress = 'text',filename = paste0("xxx/predict_", i, ".tif") # 保存預測結果)# 將預測結果存入列表prediction_list[[i]] <- prediction_map
}# # 合并所有預測結果并計算平均值
# prediction_stack <- stack(prediction_list)
# average_prediction <- mean(prediction_stack)
#
# # 保存平均結果
# writeRaster(
# average_prediction,
# filename = "G:/人獸沖突/R_code/out/average_prediction.tif",
# overwrite = TRUE
# )
#
# # 可視化平均預測
# plot(average_prediction, main = "Average Species Distribution Probability")
# points(presence_points, pch = 19, cex = 0.5, col = "red")