R - 线性模型与实验数据不匹配

R - linear model does not match experimental data

我正在尝试对由相同条件(针对多个条件)的重复测量组成的实验数据执行线性回归,以检查实验数据的可靠性。对于每种情况,我都有 ~5k-10k 的观察结果存储在数据框中 df:

[1]    cond1 repA    cond1 repB   cond2 repA   cond2 repB ...
[2]    4.158660e+06  4454400.703  ...
[3]    1.458585e+06  4454400.703  ...
[4]    NA            887776.392   ...
...
[5024] 9571785.382   9.679092e+06 ...

我使用以下代码绘制不同条件下的散点图 + lm + R^2 值(存储在 rdata 中):

for (i in seq(1,13,2)){
  vec <- matrix(0, nrow = nrow(df), ncol = 2)
  vec[,1] <- df[,i]
  vec[,2] <- df[,i+1]
  vec <- na.exclude(vec)
  plot(log10(vec[,1]),log10(vec[,2]), xlab = 'rep A', ylab = 'rep B' ,col="#00000033")
  abline(fit<-lm(log10(vec[,2])~log10(vec[,1])), col='red')
  legend("topleft",bty="n",legend=paste("R2 is",rdata[1,((i+1)/2)] <- format(summary(fit)$adj.r.squared,digits=4)))
}

但是,lm 似乎发生了偏移,因此它不符合我在实验数据中看到的趋势:

它在每种情况下都会发生。我试图通过查找源代码并浏览不同的论坛和帖子 (this or here) 来找到解释,但没有成功。

本来想简单地comment/ask几个问题,但是不能。

据我了解,repA 和 repB 的测量均有误差。因此,您不能使用普通的最小二乘法来拟合数据,该程序只考虑 Y 中的误差(有些人可能认为加权 OLS 可能有效,但我的技能不足以讨论这个问题)。您的问题似乎与 .

有关

您可以使用的是总最小二乘法:它考虑了 X 和 Y 中的误差。在下面的示例中,我使用了 "normal" TLS 假设存在相同的误差X 和 Y(因此 error.ratio=1)。如果不是,您可以通过输入 error.ratio=var(y1)/var(x1) 来指定错误率(至少我认为它是 var(Y)/var(X):检查文档以确保这一点)。

library(mcr)
MCR_reg=mcreg(x1,y1,method.reg="Deming",error.ratio=1,method.ci="analytical")
MCR_intercept=getCoefficients(MCR_reg)[1,1]
MCR_slope=getCoefficients(MCR_reg)[2,1]

# CI for predicted values
x_to_predict=seq(0,35)
predicted_values=MCResultAnalytical.calcResponse(MCR_reg,x_to_predict,alpha=0.05)
CI_low=predicted_values[,4]
CI_up=predicted_values[,5]

请注意,在 Deming/TLS 回归中,您的 x 和 y 误差应该服从正态分布,如 here. If it's not the case, go for a Passing-Bablok regressions (and the R code is here 所述)。

另请注意,R2 不是为 Deming 或 Passing Bablok 回归定义的(参见 here)。相关系数是一个很好的代理,尽管它并不能完全提供相同的信息。由于您正在研究两个因素之间的线性相关性,请参阅 Pearson 的乘积矩相关系数,并使用例如rcorr函数。