自制数据框与Excel导入数据计算EC50结果差异原因及多样本计算方法
EC50计算差异原因及多样本计算方案
一、自制数据框与Excel导入数据的EC50差异原因
两种方式结果不同的核心问题几乎都出在数据匹配或数据一致性上,具体可能的情况:
- 浓度与响应值对应关系错误:
你在Excel导入后用rep(c(0, 0.005,...), length.out = nrow(two_fold_tebu_long_data))生成浓度列时,若原Excel数据行数不是10的整数倍(每个菌株对应10个浓度梯度),会直接导致浓度值与响应值错位,和自制数据框中严格一对一的浓度-响应对应关系完全不符,拟合结果自然不同。
另外,gather(key = "strain", value = "response", -strain)的逻辑存在错误:-strain表示排除strain列,但同时将key设为strain,会导致生成的菌株标签混乱,进一步打乱数据结构。 - 数据类型或完整性差异:
Excel导入的响应值可能存在隐藏空格、非数值格式(如带单位)或缺失值,而自制数据框是纯数值型,模型拟合的基础数据本质不同,结果必然出现偏差。 - 模型拟合初始值波动:
drm函数的LL.4模型会根据数据分布选择初始拟合值,若两种方式的数据结构(如是否存在重复值)不同,可能导致拟合过程收敛到局部最优解,出现细微差异,但这种差异通常很小,若差异显著则仍是数据本身的问题。
二、多样本EC50的计算方法
正确的多样本EC50计算需要对每个菌株单独拟合剂量-响应模型,以下是修正后的代码示例:
修正后的Excel导入与多样本计算流程
# 加载依赖包 library(readxl) library(drc) library(tidyverse) # 1. 导入Excel数据(假设Excel结构:第一列为浓度梯度,后续列对应不同菌株的响应值) two_fold_tebu_data <- read_excel("test.xlsx", sheet = 1) # 2. 转换为长格式:确保浓度与菌株响应值正确匹配 two_fold_tebu_long_data <- two_fold_tebu_data %>% gather(key = "strain", value = "response", -concentration) # 3. 按菌株分组拟合模型并提取EC50 ec50_results <- two_fold_tebu_long_data %>% group_by(strain) %>% do( model = drm(response ~ concentration, data = ., fct = LL.4()), ec50 = ED(.$model, 50) %>% as.data.frame() ) %>% unnest(ec50) %>% select(strain, EC50 = Estimate, SE = Std. Error) # 输出结果 print(ec50_results)
关键说明
- 确保原Excel数据结构正确:第一列为浓度梯度,每一列对应一个菌株的所有响应值,这样
gather后每个菌株的响应值会与对应浓度自动匹配。 - 用
group_by(strain)+do()实现分组拟合,每个菌株单独生成剂量-响应模型,再提取各自的EC50和标准误。 - 若Excel数据是每行对应一个菌株的某个浓度响应,需确保浓度列已存在,无需手动用
rep生成,避免匹配错误。
补充:自制数据框的EC50提取
你之前的自制数据框代码仅拟合了模型,未提取EC50值,正确提取方式如下:
library(drc) library(tibble) concentration <- c(0, 0.005, 0.05, 0.5, 2.5, 5, 12.5, 25, 50, 100) response <- c(1.0000000, 0.9873418, 1.0000000, 0.8734177, 0.8101266, 0.7848101, 0.6962025, 0.5696203, 0.3670886, 0.1772152) data <- data.frame(concentration, response) EC50_model <- drm(response ~ concentration, data = data, fct = LL.4()) ec50_value <- ED(EC50_model, 50) # 输出EC50及标准误 tibble(EC50 = ec50_value[1,1], SE = ec50_value[1,2])
内容的提问来源于stack exchange,提问作者user168964
相关产品推荐
相关产品推荐

