本人只是纯对该类问题感兴趣而已,仅一家之言,供参考~~
背景:承接我上一个朋友圈,有位群友在群里问了这样一个问题:做两组的opls-da分析计算vip值时,两组的顺序(A vs B和B vs A)计算出来的vip值有一点点差异。这个差异是正常的么?如果是正常,是什么原因造成的?
也就是说,同一个数据,只是把样本顺序换了下,得到的结果不一样,而且是比较大的区别,这确实就有些奇怪了。按照正常逻辑来想,不应该出现这样的情况。
那么具体有没有这种情况呢?我们可以做一下测试。这里面我们使用的都是ropls函数包【1】,用其中的示例数据来测试一下。
library(ropls)data(sacurine)attach(sacurine)genders<-as.character(sampleMetadata[, "gender"])genders1<-genders[c(which(genders=="M"),which(genders=="F"))]dataMatrix1<-dataMatrix[c(which(genders=="M"),which(genders=="F")),]sacurine.oplsda <- opls(dataMatrix1, genders1, predI = 1, orthoI = 1)#代码输出结果如下:#OPLS-DA#183 samples x 109 variables and 1 response#standard scaling of predictors and response(s)# R2X(cum) R2Y(cum) Q2(cum) RMSEE pre ort pR2Y pQ2#Total 0.185 0.668 0.561 0.289 1 1 0.05 0.05##然后我们将组别换一下顺序:genders2<-genders[c(which(genders=="F"),which(genders=="M"))]dataMatrix2<-dataMatrix[c(which(genders=="F"),which(genders=="M")),]sacurine.oplsda2 <- opls(dataMatrix2, genders2, predI = 1, orthoI = 1)#代码输出结果如下:#OPLS-DA#183 samples x 109 variables and 1 response#standard scaling of predictors and response(s)# R2X(cum) R2Y(cum) Q2(cum) RMSEE pre ort pR2Y pQ2#Total 0.185 0.668 0.573 0.289 1 1 0.05 0.05#最后比较一下两个结果的VIP值boxplot(sacurine.oplsda@vipVn-sacurine.oplsda2@vipVn)
结果如下图,可以发现,结果并没有太大差别,二者相差的数值都非常小:

那么为什么该群友会遇到如此问题呢?如果你用如下的代码,结果可能确实差别比较大:
<- opls(dataMatrix1, genders1, predI = 1, orthoI = NA)#代码输出结果如下:#OPLS-DA#183 samples x 109 variables and 1 response#standard scaling of predictors and response(s)# R2X(cum) R2Y(cum) Q2(cum) RMSEE pre ort pR2Y pQ2#Total 0.329 0.774 0.614 0.24 1 3 0.05 0.05= 1, orthoI = NA)#代码输出结果如下:#OPLS-DA#183 samples x 109 variables and 1 response#standard scaling of predictors and response(s)# R2X(cum) R2Y(cum) Q2(cum) RMSEE pre ort pR2Y pQ2#Total 0.275 0.73 0.611 0.262 1 2 0.05 0.05#最后比较一下两个结果的VIP值boxplot(sacurine.oplsda.1@vipVn-sacurine.oplsda2.2@vipVn)
得到的结果图如下所示,可以发现相差最大的居然达到了0.6,这结果差别确实太大了:

所以具体问题出在了哪里?仔细比较上下两个代码你可以发现,主要就在orthoI这个参数上,这是设置正交个数的参数,其文档中这样介绍的:
orthoI Integer: number of orthogonal components (for OPLS only);when set to 0 [default], PLS will be performed; otherwise OPLSwill be peformed; when set to NA, OPLS is performed and thenumber of orthogonal components is automatically computed byusing the cross-validation (with a maximum of 9 orthogonalcomponents).
大致含义就是,当orthoI设置为NA时,opls函数会以最大9个正交成分自动计算(一定要注意,自动计算不代表是自动计算给出最优解),否则你就可以自己设置一个值。而我们将orthoI设置为NA后,将样本顺序调整以后,opls函数自动计算的orthoI值不一样了,一个为3,一个为2。参数不一样,结果自然就不一样了。
因此对于一开始的疑问:这个差异是正常的么?如果是正常,是什么原因造成的?
这里大致可以给出答案了:如果是细微的差异,这是正常的,一般差异不会超过10的-10次方。如果差异过大,那么就要检查一下参数设置,尤其是orthoI参数的设置。
那么新的问题又出来了:
为什么orthoI值设置一样,结果还会有细微的差别,也就是说不是完全一模一样的?
同样的数据,只是样本顺序改了一下,为什么opls函数自动计算的时候,会给出不一样的orthoI值?
OPLS-DA模型中,orthoI值最优解问题有没有很好的解决办法?因为我们人为设置一个数值,不一定是最优的。
诸如此类问题,以后有机会再多做闲聊吧,感兴趣的也可以自己去翻看参考资料【比如,2-3】,看看其公式推导和源代码,还是很有意思的~~
所以正如我一直所说,理解一个模型最好的办法就是去看其公式推导和源代码,否则很容易就用的不恰当了。
参考:
【1】https://bioconductor.org/packages/release/bioc/html/ropls.html
【2】doi: 10.1002/cem.695.
【3】doi: 10.1002/cem.2627.
让人人都方便分析自己的数据!本人致力于打造一款国内较为实用的数据分析云平台(https://www.omicsolution.com/wkomics/main/),为广大国内有需求的小伙伴提供帮助,也感谢大家关注转发,以求帮助更多的人,谢谢

关注一下又不会怀孕,哈哈哈。。。

平台目前包含220多个模块(还在持续更新中...):