dismo包MaxEnt模型使用data.frame时无法处理分类变量求助
使用dismo包的maxent函数处理data.frame中的分类变量问题
使用dismo包通过data.frame构建MaxEnt模型时,仅用连续解释变量模型可正常运行,但加入分类变量后构建失败。已准备好存在-缺失数据及各点协变量,希望继续使用data.frame而非RasterStack(因这是多模型函数的一部分)。
问题复现代码
library(dismo) dat <- data.frame(a = c(0, 0, 1, 1, 0), b = c(1, 2, 3, 4, 5), d = c(7, 8, 9, 9, 8), e = as.factor(c("q", "r", "s", "r", "q"))) maxent1 <- dismo::maxent(x = dat[, 2:3], p = dat$a) # 运行正常 maxent2 <- dismo::maxent(x = dat[, 2:4], p = dat$a) # 完全无法运行,报错:Error: In file(con, "r") :cannot open file 'species.lambdas': No such file or directory maxent3 <- dismo::maxent(x = dat[, c(2:3, as.factor(4))], p = dat$a) # 能运行但遗漏了分类变量
解决方法
方法1:将分类变量转换为哑变量(推荐)
MaxEnt的dismo接口对data.frame中的因子类型支持不佳,手动将分类变量转换为0-1编码的哑变量(排除基准类别避免共线性)是最稳妥的方案:
library(dismo) library(fastDummies) # 也可使用base包的model.matrix手动生成 dat <- data.frame(a = c(0, 0, 1, 1, 0), b = c(1, 2, 3, 4, 5), d = c(7, 8, 9, 9, 8), e = as.factor(c("q", "r", "s", "r", "q"))) # 生成哑变量,移除原因子列和第一个哑变量(避免共线性) dat_dummies <- dummy_cols(dat, select_columns = "e", remove_selected_columns = TRUE, remove_first_dummy = TRUE) # 构建包含哑变量的模型 maxent4 <- dismo::maxent(x = dat_dummies[, c("b", "d", "e_r", "e_s")], p = dat_dummies$a)
方法2:手动指定分类变量参数
如果不想转换哑变量,可将因子列转为字符型,再通过args参数告诉maxent哪一列是分类变量:
library(dismo) dat <- data.frame(a = c(0, 0, 1, 1, 0), b = c(1, 2, 3, 4, 5), d = c(7, 8, 9, 9, 8), e = as.factor(c("q", "r", "s", "r", "q"))) # 将因子列转为字符型(dismo处理字符型分类变量更稳定) dat$e <- as.character(dat$e) # 调用maxent时通过args指定分类变量 maxent5 <- dismo::maxent(x = dat[, 2:4], p = dat$a, args = c("categorical=e"))
原方法失败原因
maxent2失败:dismo处理data.frame中的因子时,生成的临时文件逻辑异常,导致无法读取MaxEnt输出的species.lambdas文件;maxent3遗漏变量:as.factor(4)是错误用法,仅将数字4转换为因子,并未选中data.frame的第4列,实际只用到了2-3列的连续变量。
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

