如何从R语言FRAIR包的frtest对象提取功能响应类型结果?
解决方案:提取frair_test的最优模型类型
核心思路是直接从frair_test返回的frtest对象中提取内置的best元素,该元素直接记录了拟合最优的功能响应模型名称,无需通过字符串检索这种不可靠的方式。
步骤1:修改循环逻辑,存储分类结果
替换原有的Out.List存储逻辑,改用一个字符向量直接记录每次模拟的结果类型:
library(frair); library(lamW) # 定义Rogers II功能响应函数 RogersII <- function(N0, a, h, time){ N0 - lamW::lambertW0(a * h * N0 * exp(-a * (time - h * N0)))/(a * h) } N0 <- c(4, 6, 10, 20, 60, 90, 120) # 模拟数据 set.seed(123) a.vec <- rlnorm(100, mean = log(1.704), sd = log(2)) h.vec <- rlnorm(100, mean = log(0.072), sd = log(2)) Ex1.TLow.II.Norm <- vector(mode = 'list', length = length(N0)) for (i in 1:length(N0)){ for (j in 1:100){ Ex1.TLow.II.Norm[[i]][j] <- RogersII(N0[i], a.vec[j], h.vec[j], 2) } } # 优化数据整理(替代原循环拼接) TLow.II.Norm <- do.call(rbind, lapply(1:100, function(i) { data.frame( Ne = sapply(Ex1.TLow.II.Norm, `[[`, i), N0 = N0 ) })) # 执行frair_test并分类存储结果 result_types <- character(100) # 存储每次模拟的类型 j <- 1; k <- 7 for (i in 1:100){ SimDat <- TLow.II.Norm[j:k, ] Output <- frair_test(formula = Ne ~ N0, data = SimDat) # 根据最优模型判断类型 if (Output$best == "rogersII") { result_types[i] <- "TypeII" } else if (Output$best == "rogersIII") { result_types[i] <- "TypeIII" } j <- j + 7; k <- k + 7 }
步骤2:统计两类结果的占比
用table()函数直接计算占比:
# 统计次数 type_counts <- table(result_types) # 计算占比 type_proportions <- prop.table(type_counts) print(type_counts) print(type_proportions)
关键说明
frair_test返回的frtest对象中,$best字段是官方设计用于获取最优拟合模型的入口,比字符串检索更稳定可靠。- 如果你的模拟中涉及其他TypeII/TypeIII模型(如Holling型),只需对应修改判断条件中的模型名称(比如
"hollingII"、"hollingIII")即可。
内容的提问来源于stack exchange,提问作者MadelineJC
相关产品推荐
相关产品推荐

