我很确定这有一个非常简单的解决方案,但我一整天都在挠头,似乎看不出问题出在哪里。
我正在绘制一些药理学剂量反应数据(效果很好),但是作为第一步,我想通过从我拥有的标准曲线推断,将我有些无意义的反应变量(从读板器输出)转换为可读的药物浓度生成。
我的标准曲线使用的数据如下:
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)
我现在想使用标准曲线来查找给定 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 等)
如果有人能看到我哪里出了问题,我将非常感激!
我认为求解 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