当前位置:   article > 正文

玩转ChatGPT:R代码Debug一例_chatgpt debug

chatgpt debug

一、写在前面

今天家里领导发来求助,说是用GPT-3.5写一个 计算mRNA干性指数 的R代码,运行报错。让我用GPT-4帮忙Debug一哈。

搞了半小时,还是有亿点感悟,写段文字记录记录。

二、踩坑过程

(1)先看原始的咒语

咒语:我已经使用synapser包计算得到了每个基因的干性权重标准值(第一列是基因名,第二列是权重值),现在需要计算TCGA中HCC的RNA-seq测序数据(第一行是样本名,第一列是基因名)每个样本的mRNA干性指数。

具体方法如下:

对于每个TCGA HCC测序数据中的样本,提取与基因mRNA干性权重标准值相同的基因的表达谱。通过Spearman相关系数计算每个样本的基因表达谱和基因mRNA干性权重标准值之间的相关性。对于每个样本,将其计算出的干性指数标准化到 [0,1] 的范围内。最后将所有样本的干性指数输出为一个表格。

输出的代码为:

  1. # 基因mRNA干性权重标准值文件的路径
  2. weight_file <- "干性权重.txt"
  3. # TCGA HCC测序数据文件的路径
  4. data_file <- "HTSeq - FPKM-mRNA.merge.txt"
  5. # 导入基因mRNA干性权重标准值
  6. weight <- read.table(weight_file, header = TRUE)
  7. # 导入TCGA HCC测序数据
  8. data <- read.csv(data_file, row.names = 1)
  9. # 提取与基因mRNA干性权重标准值相同的基因的表达谱
  10. common_genes <- intersect(rownames(weight), colnames(data))
  11. X <- data[, common_genes]
  12. # 计算每个样本的mRNA干性指数
  13. scores <- apply(X, 1, function(z) {
  14.   cor(z, weight$Weight, method = "spearman", use = "complete.obs")
  15. })
  16. # 标准化干性指数到 [0,1] 范围内
  17. normalized_scores <- (scores - min(scores)) / (max(scores) - min(scores))
  18. # 构建结果表格
  19. result <- data.frame(sample_name = rownames(X), mRNAsi_score = normalized_scores)
  20. # 打印结果
  21. print(result)}

两个文件的数据格式如下(分别为干性权重.txt以及HTSeq - FPKM-mRNA.merge.txt):

 RStudio运行以后报错如下:

Error in cor(z, weight$Weight, method = "spearman", use = "complete.obs") :要么同时设定'x'和'y',要么只设定矩阵式的'x'

由于我并不会R语言,我甚至不懂她这个算法是干啥的,所以就直接无脑丢给了GPT-4查查原因。

(2)先用GPT-4找错误

写一个咒语:运行代码:{XXX};

出现报错:{Error in cor(z, weight$Weight, method = "spearman", use = "complete.obs") : 要么同时设定'x'和'y',要么只设定矩阵式的'x'};

请问代码有什么错误?

输出如下:

 主要变的是这:

  1. # 提取与基因mRNA干性权重标准值相同的基因的表达谱
  2. common_genes <- intersect(rownames(weight), colnames(data))
  3. X <- data[, common_genes]
  4. # 根据共享基因筛选权重
  5. selected_weight <- weight[rownames(weight) %in% common_genes, ]
  6. # 计算每个样本的mRNA干性指数
  7. scores <- apply(X, 1, function(z) {
  8.   cor(z, weight$Weight, method = "spearman", use = "complete.obs")
  9. })

但是,依旧报错,也是同样的错误。

接着又告诉TA错误,GPT继续改进:

 修改如下:

  1. # 根据共享基因筛选权重,并按照X的行名进行重排序
  2. selected_weight <- weight[rownames(weight) %in% common_genes, ]
  3. selected_weight <- selected_weight[match(rownames(X), rownames(selected_weight)), ]

还是没有用。

我开始怀疑是否是数据格式的问题,可能需要告诉GPT数据格式。

与此同时,家里领导也分享了想法,然后提供了一个修改方案:

  1. # 提取与基因mRNA干性权重标准值相同的基因的表达谱
  2. common_genes <- intersect(rownames(weight), rownames(data))
  3. X <- data[common_genes, ]
  4. w <- weight[common_genes]

但是还是报错。可以看到,其实都觉得是这一步出了问题,所以我打算进一步问GPT。

(3)优化咒语

咒语:运行下面代码:{XXX};

数据的格式为分别为:

weight_file为{Gene_symbol w

TSPAN6 6.85388903246113e-05},

data_file 为{Tags TCGA-GJ-A3OU-01 TCGA-G3-A7M9-01 TCGA-ED-A627-01 TCGA-DD-AACB-01 TCGA-CC-5264-01

RAB4B 3.897881937 2.731438761 2.690751371 2.991402482 1.704487843

};

报错:{XXX},何修改代码?

 改的还是那一段:

  1. # 提取与基因mRNA干性权重标准值相同的基因的表达谱
  2. common_genes <- intersect(rownames(weight), rownames(data))
  3. X <- data[common_genes, ]
  4. # 根据共享基因筛选权重,并按照X的行名进行重排序
  5. w <- weight[rownames(weight) %in% common_genes, ]
  6. w <- w[match(rownames(X), rownames(w)), ]

依旧报错,我继续追问3-4回合,GPT也一直改代码,但是依旧行不通。

做到现在,可以排除数据格式的原因,代码应该也不是很难,但是为何报错呢?

没办法只能一步一步来解析了。

(4)解释整个代码

写一个咒语:请详细解析这个代码的功能,代码:{XXX}。

集中报错都在第二、三步骤,但我觉得GPT不至于连着简单的算法都不会,而且数据格式TA是知道的。

所以我考虑,会不会数据读取就有错误??!!

看了一下Rstudio的数据监视窗口,果然:

 Data都没有数值,当然算不下去!!!

(5)优化数据读取代码

咒语:data_file 为{Tags TCGA-GJ-A3OU-01 TCGA-G3-A7M9-01 TCGA-ED-A627-01 TCGA-DD-AACB-01 TCGA-CC-5264-01

RAB4B 3.897881937 2.731438761 2.690751371 2.991402482 1.704487843

};读取代码为:data <- read.csv(data_file, row.names = 1),但是读取为0列,我需要全部列的信息,如何修改代码?

 运行,数据读出来了:

 但是运行代码,依旧报错。

我有强烈预感,还是数据格式的问题,于是打开数据框,一目了然:

 基因名所在的列都不一致,匹配不了很正常,这个代码我会改:

weight <- read.table(weight_file, header = TRUE, row.names = 1)

这样,数据就对齐了:

 最后再运行代码(当然中间有些代码已经有修改,根据之前追问GPT的那几次),没报错了,至于结果对不对,我也不懂,至少跑通了。

万万没想到,居然是最不起眼的数据读取出问题,看来GPT-4也还是识别不出,一直在修改下面的算法核心部分。

下一步我测试下直接用GPT-4从头生成代码会如何?

(6)GPT-4生成代码

咒语:我已经使用synapser包计算得到了每个基因的干性权重标准值,现在需要计算TCGA中HCC的RNA-seq测序数据每个样本的mRNA干性指数。

具体方法如下:

对于每个TCGA HCC测序数据中的样本,提取与基因mRNA干性权重标准值相同的基因的表达谱。通过Spearman相关系数计算每个样本的基因表达谱和基因mRNA干性权重标准值之间的相关性。对于每个样本,将其计算出的干性指数标准化到 [0,1] 的范围内。最后将所有样本的干性指数输出为一个表格。

其中,干性权重标准值的数据格式为{Gene_symbol w

TSPAN6 6.85388903246113e-05},

TCGA中HCC的RNA-seq测序数据的格式为{Tags TCGA-GJ-A3OU-01 TCGA-G3-A7M9-01 TCGA-ED-A627-01 TCGA-DD-AACB-01 TCGA-CC-5264-01

RAB4B 3.897881937 2.731438761 2.690751371 2.991402482 1.704487843

};请用R语言写出代码。

代码如下:

  1. # 首先,安装和加载必要的包
  2. if (!require("dplyr")) {
  3.   install.packages("dplyr")
  4. }
  5. library(dplyr)
  6. # 读取你的基因干性权重标准值数据
  7. dryness_weights <- read.table("dryness_weights.txt", header = TRUE, sep = "\t")
  8. # 读取你的TCGA HCC RNA-seq数据
  9. rna_seq_data <- read.table("rna_seq_data.txt", header = TRUE, sep = "\t")
  10. # 确保基因在两个数据框中都存在
  11. common_genes <- intersect(dryness_weights$Gene_symbol, rna_seq_data$Tags)
  12. # 提取共同基因的数据
  13. dryness_weights_filtered <- dryness_weights[dryness_weights$Gene_symbol %in% common_genes, ]
  14. rna_seq_data_filtered <- rna_seq_data[rna_seq_data$Tags %in% common_genes, ]
  15. # 计算每个样本的mRNA干性指数
  16. dryness_index <- apply(rna_seq_data_filtered[, -1], 2, function(sample_expr) {
  17.   cor(dryness_weights_filtered$w, sample_expr, method = "spearman")
  18. })
  19. # 标准化干性指数到 [0,1] 的范围内
  20. dryness_index_normalized <- (dryness_index - min(dryness_index)) / (max(dryness_index) - min(dryness_index))
  21. # 输出结果
  22. dryness_index_df <- data.frame(sample_id = names(dryness_index_normalized), dryness_index = dryness_index_normalized)
  23. write.table(dryness_index_df, "dryness_index.txt", sep = "\t", quote = FALSE, row.names = FALSE)

跑出来的结果跟GPT-3.5的比,数量上都是一致的,共有371个数值,具体数值也一致:

 结束!同样的咒语我去试了GPT-3.5确实一次性写不出堪比GPT-4的代码。

三、写在最后

三点启示吧:

(1)在写咒语的时候,涉及到数据的,一定要直接复制你的数据格式给GPT(就直接复制粘贴,GPT能识别表格的分隔符),最好不要直接用文字描述,容易说不清楚;

(2)通过这个事例发现,GPT-4在找bug的时候,还是有些弱点。可能跟TA不能运行代码有关吧。然而,写代码能力还是强于GPT-3.5!

(3)最后,还是得自己理解代码,才能最高效的用GPT辅助Debug,偷懒不得啊!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/137018
推荐阅读
相关标签
  

闽ICP备14008679号