本人只是纯对该类问题感兴趣而已,仅一家之言,供参考~~

背景:承接我上一个朋友圈,有位群友在群里问了这样一个问题:做两组的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)

结果如下图,可以发现,结果并没有太大差别,二者相差的数值都非常小:

那么为什么该群友会遇到如此问题呢?如果你用如下的代码,结果可能确实差别比较大:

sacurine.oplsda.1 <- 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.05sacurine.oplsda2.2 <- opls(dataMatrix2, genders2, 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.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 OPLS will be peformed; when set to NA, OPLS is performed and the number of orthogonal components is automatically computed by using the cross-validation (with a maximum of 9 orthogonal components).

大致含义就是,当orthoI设置为NA时,opls函数会以最大9个正交成分自动计算(一定要注意,自动计算不代表是自动计算给出最优解),否则你就可以自己设置一个值。而我们将orthoI设置为NA后,将样本顺序调整以后,opls函数自动计算的orthoI值不一样了,一个为3,一个为2。参数不一样,结果自然就不一样了。

因此对于一开始的疑问:这个差异是正常的么?如果是正常,是什么原因造成的?

这里大致可以给出答案了:如果是细微的差异,这是正常的,一般差异不会超过10的-10次方。如果差异过大,那么就要检查一下参数设置,尤其是orthoI参数的设置。

那么新的问题又出来了:

  1.  为什么orthoI值设置一样,结果还会有细微的差别,也就是说不是完全一模一样的?

  2. 同样的数据,只是样本顺序改了一下,为什么opls函数自动计算的时候,会给出不一样的orthoI值?

  3. 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多个模块(还在持续更新中...):