R:从用 nls

问题描述 投票:0回答:1

我很确定这有一个非常简单的解决方案,但我一整天都在挠头,似乎看不出问题出在哪里。

我正在绘制一些药理学剂量反应数据(效果很好),但是作为第一步,我想通过从我拥有的标准曲线推断,将我有些无意义的反应变量(从读板器输出)转换为可读的药物浓度生成。

我的标准曲线使用的数据如下:

structure(list(log_Conc = c(3.45453998496482, 2.85247999363686, 
2.25042000230889, 1.64836001098093, 1.04532297878666, 0.444044795918076, 
-0.161150909262745, -0.763210900590707, -5), Average_log_val = c(0.137454, 
0.1506735, 0.2221405, 0.3992095, 0.846017, 1.5389285, 2.1200975, 
2.3373605, 2.368048)), class = c("grouped_df", "tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -9L), groups = structure(list(
    log_Conc = c(-5, -0.763210900590707, -0.161150909262745, 
    0.444044795918076, 1.04532297878666, 1.64836001098093, 2.25042000230889, 
    2.85247999363686, 3.45453998496482), .rows = structure(list(
        9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L), ptype = integer(0), class = c("vctrs_list_of", 
    "vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -9L), .drop = TRUE))

我的标准曲线被建模为 3 参数逻辑,我的编码如下:

standard_curve_logistic <- nlsLM(Average_log_val ~ lower + (upper - lower)/(1 + 10^(log_Conc-midpoint)),
                              data = Standard_cAMP_Curve,
                              start = list(lower = min(Standard_cAMP_Curve$Average_log_val), upper = max(Standard_cAMP_Curve$Average_log_val), midpoint = mean(Standard_cAMP_Curve$log_Conc)))

绘制逻辑拟合图表明它可以很好地对我的数据进行建模

r <- range(Standard_cAMP_Curve$log_Conc)
xNew <- seq(r[1],r[2],length.out = 200)
yNew <- predict(standard_curve_logistic,list(log_Conc = xNew))

plot(Standard_cAMP_Curve$log_Conc,Standard_cAMP_Curve$Average_log_val)
lines(xNew,yNew)

Standard Curve

我现在想使用标准曲线来查找给定 y 的一系列 x 值。因此我重新排列了标准曲线的公式,以求解x。然而,这样做会返回似乎根本不正确的值。我很确定我已经正确地重新排列了我的公式,所以我不知道是什么导致了这里的问题。

params = coef(standard_curve_logistic)

logistic_solve_for_x <- function(upper, lower, midpoint,y_values) { ## Solve algebraic of 3 param logistic for x
  x_value = (log10((upper-lower/y_values-lower) - 1) + midpoint) 
  return(x_value)
}

y_vector <- c(0.5,1,1.5,2) ## Some example values of y to illustrate my point

logistic_solve_for_x(upper = params[2], midpoint = params[3], lower = params[1], y_values = y_vector) 

# The results of this function are: [1] 0.6535569 0.7194098 0.7393143 0.7489347

读取标准曲线,您可以看到这些 x 值显然是不正确的(例如,我预计 y 为 2 时 x 约为 0 等)

如果有人能看到我哪里出了问题,我将非常感激!

r predict nls model-fitting drc
1个回答
0
投票

我认为求解 x 的步骤有点偏离,应该如下所示。我猜想这就像将两边除以 (U - L) 然后从每一边减去 1 而不是交叉乘以分母,但我每天不会手工做很多数学,所以我可以下车吧。

我还要提到,有时我最终使用了一些我不舒服的公式来求解 x in ,当这种情况发生时,我可能会从具有非常密集支持的模型中进行预测,然后找到与您的 y 值最接近的匹配正在寻找解决这些预测的问题(请参阅下面的懒惰方法)。

logistic_solve_for_x <- function(upper, lower, midpoint,y_values) {
  x_value = log10((upper - y_values)/(y_values - lower)) + midpoint
  return(x_value)
}
y <- seq(params[1], params[2], 0.1)
plot(Standard_cAMP_Curve$log_Conc,Standard_cAMP_Curve$Average_log_val)
lines(xNew,yNew)
lines(x = logistic_solve_for_x(upper = params[2], midpoint = params[3], lower = params[1], y),
      y = y, col = "red") # matches within the values of y

# the lazy, avoiding doing math way
newdf <- data.frame(log_Conc = seq(-5, 5, 0.001))
newdf$pred <- predict(standard_curve_logistic, newdata = newdf)
y_value <- 0.5
newdf[which.min(abs(newdf$pred - y_value)), "log_Conc"] #  1.42
logistic_solve_for_x(upper = params[2], midpoint = params[3], lower = params[1], 0.5) # 1.419654

© www.soinside.com 2019 - 2024. All rights reserved.