如何在 R 中对 ELISA 数据进行 4 参数回归

机器算法验证 r 回归 物流 生物信息学 逆向预测
2022-04-07 10:15:28

我是生物系的学生。我们进行了许多酶联免疫吸附试验 (ELISA) 实验和 Bradford 检测。4 参数逻辑回归(参考)通常用于回归这些数据遵循此函数: How我可以这样做吗?我想获得值并绘制曲线。

F(x)=(AD1+(x/C)B)+D
RABCD

PS。如果我有一些数据,如何使用计算出的函数来获取值?我的意思是如何从“数据-> F(x)-> 值”开始?F(x)

4个回答

几天后,我在这里记录我的发现:

http://www.bioassay.dk/index-filer/start/DraftDrcManual.pdf为我提供了 R 中 drc 包的当前手册。例如:

library(drc) model1 <- drm(SLOPE~DOSE, CURVE, fct=LL.4(names=c("Slope", "Lower", "Upper", "ED50")),data=spinach) 摘要(model1 ) plot(model1) 如果我想通过观察预测剂量。

model2 <- drm(DOSE~SLOPE, CURVE, fct=LL.4(names=c("Slope", "Lower", "Upper", "ED50")),data=spinach) predict(model2, newdata, type ="response") newdata 是一个数据框

在这种情况下,“预测”不是从 SLOPE 估计 DOSE 的最佳方法,因为您必须在模型 2 中反转它们,这在本示例中不起作用。

如果您想从 SLOPE 估计 DOSE,或者在 ELISA 的情况下从“OD”估计“浓度”,只需使用“drc”包的 ED 功能

例子:

library(drc)
model1 <- drm(SLOPE~DOSE, CURVE, 
              fct=LL.4(names=c("Slope", "Lower", "Upper", "ED50")),data=spinach)
plot(model1)

# the ED function is used to give the EDx value. For example, the ED50 is the 
# DOSE value for the 50% response
ED(model1,50)

# check ?ED
?ED

# The result is a matrix, from which the Estimate values can be extracted using
# the index (display=F is a good option also) 
ED(model1,50,display=F)[1:5]

# type="absolute" gives you the ability to use absolute values for the response, to 
# estimate the DOSE
response<-0.5   #lets use 0.5 for the response
DOSEx<-ED(model1,response,type="absolute",display=F)[1:5] # the estimated DOSE
points(y=rep(response,5),x=DOSEx,col="blue",pch=1:5)

您可以使用非线性回归找到参数的最小二乘估计。例子:

f=function(B,x)
  (B[1]-B[4])/(1+(x/B[3])^B[2])+B[4]

LS=function(B,y,x)
  sum((y-f(B,x))^2)

x=runif(100,0,5)
B=c(1,5,2.5,5)

y=f(B,x)
plot(x,y)

### Estimate should be very close to B
nlm(LS,c(1,1,1,1),x=x,y=y)

谷歌搜索的第二个答案4 parameter logistic r这篇有前途的论文,其中作者开发并实施了用于分析检测的方法,例如 R 包drc中的 ELISA 。具体来说,作者开发了一个LL.4()实现 4 参数逻辑回归函数的函数,用于与一般剂量反应建模函数一起使用drm

克里斯蒂安·里茨,延斯·史翠伯格。 使用 R 进行生物测定分析统计软件杂志,2005,卷。12 号,第 5 号。

Ritz 等人发表了一篇新论文,其中涵盖了对“drc”R 包的改进。 使用 R 进行剂量反应分析(PLOS ONE,2015)

这里有一个关于为校准目的拟合 4 参数逻辑模型(例如关于 ELISA 数据)的优秀 R 教程:http: //weightinginbayesianmodels.github.io/poctcalibration/over_tutorials.html http://weightinginbayesianmodels.github.io/poctcalibration /calib_tut4_curve_ocon.html http://weightinginbayesianmodels.github.io/poctcalibration/calib_tut5_precision_ocon.html http://weightinginbayesianmodels.github.io/poctcalibration/AMfunctions.html#sdXhat

他们只是使用nlsLMminpack.lm 包中的函数。即它们适合形式的模型

x <- c(478, 525, 580,  650,  700,  720,  780,  825,  850,  900,  930,  980, 1020, 1040, 1050, 1075, 1081, 1100, 1160, 1180, 1200)
y <- c(1.70, 1.45, 1.50, 1.42, 1.39, 1.90, 2.49, 2.21, 2.57, 2.90, 3.55, 3.80, 4.27, 4.10, 4.60, 4.42, 4.30, 4.52, 4.40, 4.50, 4.15)

M.4pl <- function(x, lower.asymp, upper.asymp, inflec, hill){
      f <- lower.asymp + ((upper.asymp - lower.asymp)/
                            (1 + (x / inflec)^-hill))
      return(f)
    }

require(minpack.lm)
nlslmfit = nlsLM(y ~ M.4pl(x, lower.asymp, upper.asymp, inflec, hill),
                     data = data.frame(x=x, y=y),
                     start = c(lower.asymp=min(y)+1E-10, upper.asymp=max(y)-1E-10, inflec=mean(x), hill=1),
                     control = nls.control(maxiter=1000, warnOnly=TRUE) )
    summary(nlslmfit)
    # Parameters:
    #   Estimate Std. Error t value Pr(>|t|)    
    #   lower.asymp   1.5371     0.1080   14.24 7.06e-11 ***
    #   upper.asymp   4.5508     0.1497   30.40 2.93e-16 ***
    #   inflec      889.1543    14.0924   63.09  < 2e-16 ***
    #   hill         13.1717     2.5475    5.17 7.68e-05 ***
    require(investr)
    xvals=seq(min(x),max(x),length.out=100)
    predintervals = data.frame(x=xvals,predFit(nlslmfit, newdata=data.frame(x=xvals), interval="prediction"))
    confintervals = data.frame(x=xvals,predFit(nlslmfit, newdata=data.frame(x=xvals), interval="confidence"))
    require(ggplot2)
    qplot(data=predintervals, x=x, y=fit, ymin=lwr, ymax=upr, geom="ribbon", fill=I("red"), alpha=I(0.2)) +
      geom_ribbon(data=confintervals, aes(x=x, ymin=lwr, ymax=upr), fill=I("blue"), alpha=I(0.2)) +
      geom_line(data=confintervals, aes(x=x, y=fit), colour=I("blue"), lwd=2) +
      geom_point(data=data.frame(x=x,y=y), aes(x=x, y=y, ymin=NULL, ymax=NULL), size=5, col="blue") +
      ylab("y")

在此处输入图像描述

他们还展示了如何使用权重和迭代修正的最小二乘来允许非齐次方差。它还包括如何进行逆预测和计算衍生统计数据,如确定检测限、定量限和工作范围。

我自己虽然使用受约束的严格单调 P 样条拟合,但使用scam包拟合来做校准曲线,我有更多的运气,因为这导致比使用四参数逻辑模型更窄的 95% 置信区间和预测区间......即形式的模型

require(scam)
nknots = 20 # desired nr of knots
fit = scam(y~s(conc,k=nknots,bs="mpi",m=2), family=gaussian, data=data)

如果您的数据是离散计数而不是某些连续测量,您也可以使用family=poisson对数链接,或使用log(y+1)转换后的因变量。你也可以log(conc+1)在你的公式中使用,因为浓度永远不会变成负数。