微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

添加 Passing-Bablok 回归线

如何解决添加 Passing-Bablok 回归线

我必须在不同的测量方法之间进行多次比较,并且必须使用 Passing-Bablok regression 方法

我想利用 ggplot2 和 faceting,但我不知道如何基于 Passing-Bablok 回归添加 geom_smooth 层。 我在想这样的事情:https://stackoverflow.com/a/59173260/2096356

此外,我还需要在每个图中显示回归线方程,以及截距和斜率参数的置信区间。

使用部分解决方案进行编辑

我找到了结合 this postin this answer 中提供的代码的部分解决方案。

## Regression algorithm
 passing_bablok.fit <- function(x,y) {
  
    x_name <- deparse(substitute(x))
  
    lx <- length(x)
    l <- lx*(lx - 1)/2
    k <- 0
    S <- rep(NA,lx)
    for (i in 1:(lx - 1)) {
      for (j in (i + 1):lx) {
        k <- k + 1
        S[k] <- (y[i] - y[j])/(x[i] - x[j])
      }
    }
    S.sort <- sort(S)
    N <- length(S.sort)
    neg <- length(subset(S.sort,S.sort < 0))
    K <- floor(neg/2)
    if (N %% 2 == 1) {
      b <- S.sort[(N+1)/2+K]
    } else {
      b <- sqrt(S.sort[N / 2 + K]*S.sort[N / 2 + K + 1])
    }
    a <- median(y - b * x)
    res <- as.vector(c(a,b))

  names(res) <- c("(Intercept)",x_name)
  class(res) <- "Passing_Bablok"
  res
}

## Computing confidence intervals
 passing_bablok <- function(formula,data,R = 100,weights = NULL){
  ret <- boot::boot(
    data = model.frame(formula,data),statistic = function(data,ind) {
      data <- data[ind,]
      args <- rlang::parse_exprs(colnames(data))
      names(args) <- c("y","x")
      rlang::eval_tidy(rlang::expr(passing_bablok.fit(!!!args)),env = rlang::current_env())
    },R=R
  )
  class(ret) <- c("Passing_Bablok",class(ret))
  ret  
}

## Plotting confidence bands
 predictdf.Passing_Bablok <- function(model,xseq,se,level) {
  pred <- as.vector(tcrossprod(model$t0,cbind(1,xseq)))
  if(se) {
    preds <- tcrossprod(model$t,xseq))
    data.frame(
      x = xseq,y = pred,ymin = apply(preds,2,function(x) quantile(x,probs = (1-level)/2)),ymax = apply(preds,probs = 1-((1-level)/2)))
    )
  } else {
    return(data.frame(x = xseq,y = pred))
  }
}

用法示例:

z <- data.frame(x = rnorm(100,mean = 100,sd = 5),y = rnorm(100,mean = 110,sd = 8))

ggplot(z,aes(x,y)) + 
 geom_point() + 
 geom_smooth(method = passing_bablok) + 
 geom_abline(slope = 1,intercept = 0)

到目前为止,我还没有能够展示回归线方程,以及截距和斜率参数的置信区间(如 +- 或括号中)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。