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

时间:2017-01-02 15:00:46

标签: r linear-regression

我试图对由相同条件(对于几种条件)的重复测量组成的实验数据进行线性回归,以检查实验数据的可靠性。对于每个条件,我有~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似乎被转移,因此它不符合我在实验数据中看到的趋势:

enter image description here

每种情况都会持续发生。我通过查找源代码并浏览不同的论坛和帖子(thishere),不成功地试图找到解释。

1 个答案:

答案 0 :(得分:2)

想要简单地评论/提出几个问题,但不能。

根据我的理解,repA和repB都是错误的。因此,您无法使用普通的最小二乘法来拟合您的数据,这只考虑了Y中的错误(有些人可能认为加权的OLS可能有效,但是我并不熟悉这个问题)。您的问题似乎与this one相关联。

你可以使用的是一个总体最小二乘法:它考虑了X和Y中的误差。在下面的例子中,我使用了一个&#34;正常&#34; 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所述。如果情况并非如此,请选择Passing-Bablok回归(并且R代码为here)。

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