You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 19:37:04