0

我正在尝试遍历一些剂量相关的数据并使用该drm()函数对其进行拟合。但是,对于某些数据,我收到以下错误:

optim 错误(startVec,opfct,hessian = TRUE,method = optMethod,control = list(maxit = maxIt,:非有限有限差分值 [4] drmOpt 错误(opfct,opdfct1,startVecSc,optMethod,受约束,warnVal , : 收敛失败

我不明白为什么这仅发生在特定数据集上,当几乎相同的数据通过就好了。我试着用谷歌搜索一下,看看是否有人遇到过类似的问题并找到了这个(但是,它并没有真正为我提供有用的解决方案)。

https://stats.stackexchange.com/questions/185542/questions-with-fitting-a-dose-response-curve-using-drc-package-in-r

以下是 2 个产生和不产生任何错误的数据示例:

#Data
Data_OK <- c(1.53148, 1.51851, 1.53148, 1.51851, 1.51188, 1.54407, 1.51851, 1.50515, 1.51851, 1.53148, 1.53148, 1.53148, 1.53148, 1.51851, 1.51851, 1.50515)

Data_NotOK <- c(1.51851, 1.50515, 1.49136, 1.49136, 1.50515, 1.47712, 1.47712, 1.49136, 1.51851, 1.47712, 1.49136, 1.50515, 1.50515, 1.49831, 1.49136, 1.50515)

c <- c(0.00000000 0.00015625 0.00031250 0.00062500 0.00125000 0.00250000 0.00500000 0.01000000, 0.00000000 0.00015625 0.00031250 0.00062500 0.00125000 0.00250000 0.00500000 0.01000000)
#Output Data_OK

library(drc)

fit_OK <- drm(Data_OK ~ c, fct = LL.5())
plot(fit_OK)

这将为您提供以下情节

Data_OK 的输出图

虽然这


#Output Data_NotOK

library(drc)

fit_NotOK <- drm(Data_NotOK ~ c, fct = LL.5())
plot(fit_NotOK)

生成以下错误

optim 错误(startVec,opfct,hessian = TRUE,method = optMethod,control = list(maxit = maxIt,:非有限有限差分值 [4] drmOpt 错误(opfct,opdfct1,startVecSc,optMethod,受约束,warnVal , : 收敛失败

有趣的是,我注意到如果我更改浓度向量,则不会发生错误。

library(drc)

Data_NotOK <- c(1.51851, 1.50515, 1.49136, 1.49136, 1.50515, 1.47712, 1.47712, 1.49136, 1.51851, 1.47712, 1.49136, 1.50515, 1.50515, 1.49831, 1.49136, 1.50515)

c1 <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)

fit_NotOKc1 <- drm(Data_NotOK ~ c1, fct = LL.5())
plot(fit_NotOKc1)

Data_NotOK,更改了浓度向量

我还尝试将拟合更改为 LL.4()、LL.3() 等,但这似乎无济于事......

知道为什么会发生这种情况以及如何解决吗?

编辑

我现在还 使用 R 中的 drc 包发现了多个剂量反应曲线的回归

他们建议使用 try/catch,我将对其进行测试。我将发布有关进展情况的更新。但是,我仍然想获得某种数据图。知道如何将其实现为循环吗?

4

1 回答 1

0

这是在 tibble 上使用 dplyr 和 tidyr 的解决方案。该代码使用上面的变量。但是,我建议不要将函数名用作变量。

该代码首先为每个数据子集拟合一个模型,识别具有解决方案的子集,然后将两个子集的结果绘制在一条曲线上。

library(dplyr)
library(tidyr)
library(tibble)
library(drc)

# Format data as a tibble
df = tibble::tibble(dose     = c(rep(c, 2), c1),
                    response = c(Data_OK, Data_NotOK, Data_NotOK),
                    group    = c(rep("OK",   length(c)),
                                 rep("FAIL", length(c)),
                                 rep("OK!",  length(c1))))

#' Wrap DR analysis in tryCatch to checks if there is a solution
#' @param .x tibble with response and dose columns
.has_solution = function(.x) {
  base::tryCatch(drc::drm(data = .x, response ~ dose, fct = LL.5()),
                 error=function(e){FALSE}) %>%
    base::isFALSE()
}

# Fit curve for each subset individually and only keep the ones that work
df = df %>%
  tidyr::nest(data=-group) %>%
  dplyr::mutate(use_it = purrr::map_lgl(data, ~ !.has_solution(.x))) %>%
  dplyr::filter(use_it)

# Unnest the data and fit again using the curveid parameter
df %>%
  tidyr::unnest(data) %>%
  dplyr::select(-use_it) %>%
  drc::drm(data=., response ~ dose, fct = drc::LL.5(), curveid = group) %>%
  plot()


在此处输入图像描述

于 2021-09-23T14:00:31.853 回答