在过去几周里,在测试ChatGPT-4o能否正确可靠地运行一系列单变量统计方法的过程中,我发现虽然它能够相当熟练地运行和解读简单的模型,但在更复杂的技术上却难以胜任。然而,当处理大量数据,包括许多不同的响应变量和预测因子时,单变量统计方法是不够的,需要使用多变量技术。这种情况对于许多需要调查例如植物物种组成的变化、微生物群落的差异或者许多基因的基因表达变化的研究生来说都很常见。因此,我需要教授学生多变量技术。在我的课程中,我们从一个为期一周的线性代数入门开始,教授学生矩阵乘法和特征值分解的概念,因为不了解特征值和特征向量的概念就无法理解这些技术是如何工作的。随后,我介绍了基于Bray-Curtis方法的手动排序技巧。最后,我开始讲解多变量方法,从介绍主成分分析及其解释性对应方法冗余分析开始,接下来是对应分析和典范对应分析。虽然这些方法相当复杂,我并不期望学生能深入理解其背后的理论,而是更注重它们的应用和结果的解读。在课堂上讲解了这些方法后,学生需要完成一项作业,以展示他们对于这些方法正确应用和结果解读的理解。因为这些方法并不难运行,我为学生提供了一个可以编译的RMarkdown文件,他们需要回答我关于结果的问题。
这周,我的目标是将ChatGPT-4o与这项任务进行基准测试,看看它在运行和解读这些方法的结果时有多可靠。因为我把R代码提供给了学生,所以我需要将这些代码转化为ChatGPT-4o可以理解的指令,让它能够自动生成代码来运行这些技术,尽可能接近在R中运行的代码的样子,然后回答关于它生成的结果的问题。下面我总结一下ChatGPT-4o完成这些任务的情况。
这次作业使用了与我们之前任务中相同的制表符分隔数据集,该数据集关于海洋甲壳类动物(海洋十足类)。在数据集中,样本ID列之后,前12列表示样本中的不同甲壳类动物数量(物种数据),而最后7列则代表与样本相关的环境因素。
首先,我让ChatGPT-4o对物种数据集进行一次简单的主成分分析,在归一化变量之后。归一化是很重要的,因为如果没有归一化,那些数量较多或方差较大的物种可能会主导前几主要成分,而不管它们与其他变量之间的关系。ChatGPT-4o完全能够胜任这项任务,使用了sklearn.decomposition模块中的PCA函数进行分析。它提取了主成分,并按照它们解释的总变异的比例进行了排序。在请求之后,它能够创建一个正确的碎石图(screeplot),碎石图中的y轴可以表示解释的方差(惯量)或解释的方差比例。所有这些结果都与R中的结果相同。当被问及前两个轴是否累计解释了足够的方差,以忽略其他轴时,ChatGPT-4o正确地推理出它们仅解释了41.31%的总方差,因此没有解释足够多的方差,并且正确地建议碎石图也得出了相同的结论。ChatGPT-4o还正确地创建了一个双变量图(biplot),其中样本用点表示,特定物种变量的载荷量用箭头表示,相对于前两个主成分。然而,双变量图的比例有些不对,样本分散得更开,箭头更短,与R中的双变量命令生成的双变量图相比,无论是基于相关性的双变量图还是基于距离的双变量图。有趣的是,获得的载荷值与R中的一致。
PCA相关性双图(生物量图),左图为ChatGPT-4o生成的物种数据,右图为R中的biplot命令生成的图。请注意两图之间的定性相似性。
当被问及哪些物种与第一个主成分正相关时,ChatGPT-4仅列出了几个物种,并建议其余物种与之负相关,但实际上所有物种都是与该轴正相关的。然而,在被指出这一点的情况下,它纠正了自己的错误。ChatGPT-4在识别哪些物种与第二个主成分轴正相关时也有类似的问题,起初错误地提到了两个物种,然后说所有物种都与之负相关,似乎混淆了第一个和第二个主成分轴,经过几次提示后,最终正确地识别出与第二个主成分轴正相关的四个物种。相比之下,它在二维空间中识别哪个样本最接近特定样本时,表现得更好。它同样能够识别哪个物种与特定物种最相似,哪个物种与之最不相似,尽管它再次使用了箭头端点间的欧几里得距离作为标准,而不是使用相关性双图上的箭头角度作为标准。
然后,我让ChatGPT-4o对同一物种的数据集进行冗余变量分析,以查看其中的变化有多少可以由相同样本的环境变量变化来解释。由于一个环境变量缺失数据,相关的数据行被移除,并且数据集在标准化后运行分析。ChatGPT-4o同意了,但我注意到它并没有调用专门的冗余分析函数,而是调用了sklearn.linear_model模块中的LinearRegression函数。考虑到冗余分析结合了多元回归和主成分分析,这种做法似乎合适。在确认ChatGPT-4o对所有变量进行了重新缩放之后,我让它运行冗余分析,它提供了各个冗余分析轴解释方差的比例以及物种数据集的变化有多少可以由环境变量变化解释的正确值。ChatGPT-4o还生成了一张显示每个冗余分析轴惯性的合理的斯克里普图(特征根图),并得出结论,该图结果与之前得到的数据吻合。
问题开始出现,当我要求绘制相关性和距离的三元图时。这些三元图与使用R中的vegan包的plot.cca()命令生成的三元图有显著差异。样本点似乎变形了,虽然物种箭头似乎对应着物种标签,但环境变量的箭头完全指向了错误的方向。有时可能是由于旋转或典范系数符号交换,但这在此情况下似乎并非如此。这些差异导致了识别哪些样本与哪些其他样本最相似(或不同)的问题,然而ChatGPT-4o能够基于载荷的欧几里得距离(标签)识别哪些物种最为相似。然而,它完全错误地判断了哪些环境变量与哪些冗余分析轴是正相关或负相关的。这并非因为它无法解释典范系数或读取自己的三元图,而是因为这些系数与R中的vegan包的rda()函数得到的结果不同。这也导致了识别哪些环境变量最相关或不相关的类似问题。
冗余分析的相关性三角图,左图为ChatGPT-4o创建,右图为R中的plot.cca()创建。请注意,物种相似,但样本和环境变量存在差异。
接着,我让ChatGPT-4o对物种数据集进行对应分析,去除了所有物种值为零的行(即没有生物样本的行),因为对应分析技术无法处理这种情况。ChatGPT-4o决定使用sklearn.decomposition模块中的TruncatedSVD函数来完成这个任务,该函数执行截断奇异值分解,它认为这与对应分析相似。然而,此时,对应分析轴所解释的方差比例与使用R中vegan包的cca()函数获得的结果不一致。在进一步追问下,ChatGPT-4o承认实际上并没有进行对应分析,而是尝试通过计算行和列轮廓以及对卡方残差矩阵进行奇异值分解来实现。对应的轴所解释的方差比例更接近,但与R中的结果并不完全相同。ChatGPT-4o正确地得出结论,前两个轴解释的累积方差比例(57.42%)不足以仅依靠这两大轴进行解释。当被问及Python是否有专门的库可以运行对应分析时,ChatGPT-4o建议使用prince库,然而它无法访问该库。它能够生成一个类似于R中创建的斯科图图(Screeplot),但惯性值相差了大约五个数量级。ChatGPT-4o能够正确评估,这个斯科图图也支持同样的结论,即需要超过两个轴来进行解释。
当我要求ChatGPT-4o生成一个代表样本为点、物种为标签或箭头的双图时,生成的图表与R中的vegan包的plot.cca()命令生成的图相比,无论是在相关性图还是距离图上,看起来都不太一致。虽然一些样本的位置符合正确模式,但这并不是所有样本的情况,这可能是由于使用了原始标签或在移除缺失值或无生物的站点后的新的顺序。物种标签的位置和方向也与使用R时有所不同,尽管在定性的吻合上有一定的相似性。观察行和列的得分情况,它们与R中获得的得分在定性的吻合上是相似的,但它们的标度方式不同。ChatGPT-4o拒绝生成一个按特征值的平方根对物种和样本进行标度的图,称这不是标准做法,尽管plot.cca()有一个scaling=3的选项。尽管存在这些问题,它能够正确识别哪些物种与哪个对应分析轴正相关或负相关。然而,它无法准确识别哪个样本最接近特定样本,或者哪个物种最相似(或最不相似)于其他物种。
对应分析由ChatGPT-4o(左)和R中的plot.cca()函数(右)得到的对应分析双标图。注意两者之间的相似性。
最后,我让ChatGPT-4o进行了一项典范对应分析,以评估物种数据集中由对应分析描述的变异有多少比例可以由环境数据集中的变异解释,针对相同的样本。由于一些环境变量存在缺失值,我们不得不从分析中移除这些变量,同时从物种和环境数据集中删除相应的样本。起初,看起来ChatGPT-4o遵从了我的请求,并使用了sklearn.cross_decomposition
模块中的CCA函数编写了代码,打印了一些关于进行典范对应分析的注释信息,并生成了物种和环境得分。然而,典范对应轴解释的方差百分比与使用R中的vegan包中的cca()函数获得的结果非常不同且显著较小。此外,物种数据集中的变异由环境数据集中的变异解释的比例非常小(仅为0.0023%),与在R中获得的54.88%相差甚远,这也与受约束惯性和总惯性的比值相符。碎石图看起来非常奇怪,后面的轴解释的总方差比例比前面的轴大得多。当我要求它创建一个相关性和距离三图,展示样本为点,物种为标签,环境变量以箭头形式表示时,生成的图与R中的vegan包的plot.cca()函数生成的图截然不同。基于这一点,ChatGPT-4o在回答哪些样本或物种彼此更相似或不相似,哪些环境变量与两个典范对应分析轴正相关或负相关,或哪些环境变量关系密切方面表现不佳。
由ChatGPT-4o生成的典范对应分析(CCA)相关性双标图(左)和由R中的plot.cca()生成的典范对应分析相关性双标图(右)。它们看起来截然不同。
后来,当我问起为什么ChatGPT-4o没有用相同的CCA函数来做对应分析时,我明白了其中的区别。它使用的CCA函数并不是进行典范对应分析(Canonical Correspondence Analysis),而是典型相关分析(Canonical Correlation Analysis)! 这两种方法虽然简写相同,但内容差异很大!典型相关分析是一种线性回归技术,用于寻找两个数据集之间的关系,而真正的典范对应分析则是通过计算物种和环境之间的残差卡方距离来进行奇异值分解。难怪结果会不同!不幸的是,按照ChatGPT-4o的说法,Python里并没有可以直接等效R中vegan包里的cca()函数的功能,它推荐了各种手动方法,但我并不信任这些方案。
当被要求比较主成分分析(PCA)和对应分析的结果,以及冗余分析和典型对应分析的结果时,ChatGPT-4o 能够正确地比较和对比不同的方法,并讨论它们的基本假设,尽管它错误地声称PCA假设了正态分布。它甚至还列出了一个假设表。它正确地选择了典型对应分析作为适用于该数据集的最合适方法,考虑到其生态性质以及PCA可能违反线性假设的情况。然而,它未能在PCA/RDA双变量图中识别出马蹄形或弧形效应,尽管所有物种都与第一个主成分/冗余分析轴呈正相关,并且样本呈现出类似“[楔形]”的布局。在被要求推荐其他分析方法时,它正确推荐了非度量多维标度作为首选,但它还列出了许多其他选项(如GAMs),但这些选项在当前情况下相关性较低。
总之,我在使用ChatGPT-4o运行这些多元分析技术时,只取得了一定的成功。它能够相对较好地运行和解释主成分分析(PCA),但在解释结果时,特别在确定哪些物种与哪些轴正相关或负相关时,它显得有些困惑。在进行冗余分析时,虽然它找到了一种可以部分复现R中结果的方法,但结果并不一致,并且我难以获得一致的结果。我还能够引导ChatGPT-4o手动制定一种接近合理的对应分析方法,其结果与R中的结果接近但并不完全相同。虽然双图与R中的结果不相似,但是一些定性结果得到了复制。最后,典型对应分析完全失败了,因为它使用了一个听起来相似但不适当的方法,产生了毫无用处甚至可能误导的结果。然而,ChatGPT-4o通常能够正确解释结果(尽管有时结果是错误的),除了少数例外情况。因此,根据这次实验,我仅建议使用ChatGPT-4o运行PCA,并仔细检查其解释结果,但不建议尝试其他我测试的技术。
下周,我们将看看ChatGPT-4o如何执行MANOVA、线性判别分析及相关的分类技术的表现如何。
共同学习,写下你的评论
评论加载中...
作者其他优质文章