R语言生物等效性Bootstrap模拟实现及报错解决
生物等效性Bootstrap模拟报错解决
问题背景
需在R中针对包含AUC0-∞(AUCIFO)、AUClast(AUCLST)、Cmax(CMAX)三个药代动力学参数的生物等效性研究开展Bootstrap模拟:
- 从样本量为25的实际研究数据集有放回抽样,将样本量扩充至100
- 使用
BE包的be2x2函数计算生物等效性 - 重复1000-10000次后生成各参数的几何均值比(GMR)及90%置信区间
编写theta函数后,执行bootstrap(be_df, 10, theta)时触发错误:
Error in UseMethod("filter") : no applicable method for 'filter' applied to an object of class 'list'
错误原因
原代码使用的bootstrap函数(通常来自boot包)要求统计量函数theta必须接收数据集作为参数,但实现逻辑直接调用外部数据集,导致抽样后传递给filter的对象是列表而非数据框,触发类型不匹配错误。
优化后的解决方案代码
theta <- function() { # 有放回抽取100个受试者ID,生成新ID序列 temp <- data.frame(SAMP = sample(c(1:25), 100, replace=TRUE), ID = c(1:100)) # 匹配对照组(R)数据并替换为新ID ref <- temp %>% left_join(., x101_boot_be %>% filter(TRT == "R"), by = c("SAMP" = "SUBJ")) %>% select(-SAMP) # 匹配试验组(T)数据并替换为新ID test <- temp %>% left_join(., x101_boot_be %>% filter(TRT == "T"), by = c("SAMP" = "SUBJ")) %>% select(-SAMP) # 合并两组数据,重命名ID列为SUBJ以适配分析函数要求 be_df <- rbind(ref,test) %>% rename(SUBJ=ID) # 静默执行2×2交叉设计的生物等效性分析 be_results <- be2x2_quiet(be_df, c("AUCIFO", "AUCLST", "CMAX")) # 提取各参数GMR的90%置信区间中点值 AUCIFO_GMR <- c(be_results$AUCIFO$`90% Confidence Interval of Geometric Mean Ratio (T/R)`[2]) AUCLST_GMR <- c(be_results$AUCLST$`90% Confidence Interval of Geometric Mean Ratio (T/R)`[2]) CMAX_GMR <- c(be_results$CMAX$`90% Confidence Interval of Geometric Mean Ratio (T/R)`[2]) # 返回本次模拟的各参数GMR结果 list(c(AUCIFO_GMR=AUCIFO_GMR, AUCLST_GMR=AUCLST_GMR, CMAX_GMR=CMAX_GMR)) } # 重复执行1000次Bootstrap模拟 boostrap_results <- replicate(1000L, theta()) # 将多次模拟结果转换为数据框,方便后续统计分析 boostrap_results_df <- as.data.frame(do.call(rbind, boostrap_results))
方案说明
- 放弃
boot包的bootstrap函数,改用replicate直接重复执行自定义抽样与分析逻辑,彻底规避参数类型不匹配问题 - 每次模拟流程:
- 从原25个受试者中有放回抽取100个样本,生成新的受试者ID
- 分别匹配对照组与试验组的药代数据,合并为符合
be2x2_quiet要求的数据集格式 - 提取各参数GMR的90%置信区间中点值,整理为列表返回
- 最后通过
do.call(rbind, ...)将多次模拟结果合并为数据框,可进一步计算模拟所得GMR的均值、置信区间等统计量
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

