这个问题与以下问题相关,但我无法使其工作
在每个组上拟合模型,并使用不属于该组的所有行的数据对其进行评估,R
基本上我有一个结构如下的数据框。 这是通过在“多重”机器上分析我的不同实验条件而生成的,本质上是为多个不同的感兴趣的“细胞因子”生成强度读数。作为该测试的一部分,我使用每种细胞因子的标准浓度来生成标准曲线(通过拟合 5 参数模型生成)。在我的数据中,这些标准保存在“条件”列中,并标记为(标准1、标准2等)。 然后,我想将这些模型应用于我的“实验”条件的强度数据,以为我的实验生成预测“值”。
test <- data.frame(
condition = as.factor(c("standard1", "standard2", "standard3", "standard4", "standard5", "standard6", "standard1", "standard2", "standard3", "standard4", "standard5", "standard6", "experiment1", "experiment2", "experiment3")),
cytokine = as.factor(c("IL1", "IL1", "IL1", "IL1", "IL1", "IL1", "CXCL1", "CXCL1", "CXCL1", "CXCL1", "CXCL1", "CXCL1", "IL1", "IL1", "CXCL1")),
value = as.numeric(c(1000, 500, 200, 100, 50, 25, 1500, 1000, 400, 300, 50, 20, NA, NA, NA)),
intensity = as.numeric(c(1.00, 0.6, 0.3, 0.2, 0.1, 0.05, 0.95, 0.87, 0.50, 0.4, 0.2, 0.1, 0.5, 0.7, 0.1)))
我的真实数据更长,有更多的条件和细胞因子
我已经尝试了以下方法,并认为到目前为止它有效
# Make a function to fit the 5PL model
fit_5pl <- function(data) {
drc::drm(
value ~ intensity,
data = data,
fct = drc::LL.5(names = c("Slope", "Lower", "Upper", "EC50", "Asym"))
)
}
# generate model for each cytokine
test_fit <- test %>%
nest(-cytokine) %>%
mutate(fit = map(data, fit_5pl))
然后,我在尝试将这些模型应用于实验数据时陷入困境。我尝试创建一个循环并模拟给定示例中的工作,但无法管理它!
任何建议,特别是使用 tidyverse 或 tidymodels 将不胜感激!很高兴还包括我尝试过的方法,但到目前为止还没有奏效。非常感谢!
也许您正在寻找类似的东西,并得到
broom::augment
的帮助。
test |>
# make a variable that separates the standards from the experimental data
mutate(type = ifelse(str_detect(condition, "standard"), "standard", "experiment")) |>
nest(.by = c(cytokine, type)) |>
# we want 1 row per cytokine
pivot_wider(names_from = type, values_from = data) |>
mutate(
# fit the standard curve
fit = map(standard, fit_5pl),
# then predict the values for the experimental condition
predicted = map2(fit, experiment, \(m, nd) broom::augment(m, newdata = nd))
) |>
unnest(predicted) |>
select(cytokine, condition, intensity, .fitted)
# A tibble: 3 × 4 cytokine condition intensity .fitted <fct> <fct> <dbl> <dbl> 1 IL1 experiment1 0.5 389. 2 IL1 experiment2 0.7 621. 3 CXCL1 experiment3 0.1 41.7