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