玩转ChatGPT:R代码Debug一例

一、写在前面

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

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

二、踩坑过程

(1)先看原始的咒语

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

具体方法如下:

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

输出的代码为:

# 基因mRNA干性权重标准值文件的路径

weight_file <- "干性权重.txt"

# TCGA HCC测序数据文件的路径

data_file <- "HTSeq - FPKM-mRNA.merge.txt"

# 导入基因mRNA干性权重标准值

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

# 导入TCGA HCC测序数据

data <- read.csv(data_file, row.names = 1)

# 提取与基因mRNA干性权重标准值相同的基因的表达谱

common_genes <- intersect(rownames(weight), colnames(data))

X <- data[, common_genes]

# 计算每个样本的mRNA干性指数

scores <- apply(X, 1, function(z) {

  cor(z, weight$Weight, method = "spearman", use = "complete.obs")

})

# 标准化干性指数到 [0,1] 范围内

normalized_scores <- (scores - min(scores)) / (max(scores) - min(scores))

# 构建结果表格

result <- data.frame(sample_name = rownames(X), mRNAsi_score = normalized_scores)

# 打印结果

print(result)}

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

玩转ChatGPT:R代码Debug一例_第1张图片

玩转ChatGPT:R代码Debug一例_第2张图片

 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'};

请问代码有什么错误?

输出如下:

玩转ChatGPT:R代码Debug一例_第3张图片

 主要变的是这:

# 提取与基因mRNA干性权重标准值相同的基因的表达谱

common_genes <- intersect(rownames(weight), colnames(data))

X <- data[, common_genes]

# 根据共享基因筛选权重

selected_weight <- weight[rownames(weight) %in% common_genes, ]

# 计算每个样本的mRNA干性指数

scores <- apply(X, 1, function(z) {

  cor(z, weight$Weight, method = "spearman", use = "complete.obs")

})

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

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

玩转ChatGPT:R代码Debug一例_第4张图片

 修改如下:

# 根据共享基因筛选权重,并按照X的行名进行重排序

selected_weight <- weight[rownames(weight) %in% common_genes, ]

selected_weight <- selected_weight[match(rownames(X), rownames(selected_weight)), ]

还是没有用。

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

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

# 提取与基因mRNA干性权重标准值相同的基因的表达谱

common_genes <- intersect(rownames(weight), rownames(data))

X <- data[common_genes, ]

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},何修改代码?

玩转ChatGPT:R代码Debug一例_第5张图片

 改的还是那一段:

# 提取与基因mRNA干性权重标准值相同的基因的表达谱

common_genes <- intersect(rownames(weight), rownames(data))

X <- data[common_genes, ]

# 根据共享基因筛选权重,并按照X的行名进行重排序

w <- weight[rownames(weight) %in% common_genes, ]

w <- w[match(rownames(X), rownames(w)), ]

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

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

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

(4)解释整个代码

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

玩转ChatGPT:R代码Debug一例_第6张图片

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

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

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

玩转ChatGPT:R代码Debug一例_第7张图片

 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列,我需要全部列的信息,如何修改代码?

玩转ChatGPT:R代码Debug一例_第8张图片

 运行,数据读出来了:

玩转ChatGPT:R代码Debug一例_第9张图片

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

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

玩转ChatGPT:R代码Debug一例_第10张图片

玩转ChatGPT:R代码Debug一例_第11张图片

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

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

这样,数据就对齐了:

玩转ChatGPT:R代码Debug一例_第12张图片

 最后再运行代码(当然中间有些代码已经有修改,根据之前追问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语言写出代码。

代码如下:

# 首先,安装和加载必要的包

if (!require("dplyr")) {

  install.packages("dplyr")

}

library(dplyr)

# 读取你的基因干性权重标准值数据

dryness_weights <- read.table("dryness_weights.txt", header = TRUE, sep = "\t")

# 读取你的TCGA HCC RNA-seq数据

rna_seq_data <- read.table("rna_seq_data.txt", header = TRUE, sep = "\t")

# 确保基因在两个数据框中都存在

common_genes <- intersect(dryness_weights$Gene_symbol, rna_seq_data$Tags)

# 提取共同基因的数据

dryness_weights_filtered <- dryness_weights[dryness_weights$Gene_symbol %in% common_genes, ]

rna_seq_data_filtered <- rna_seq_data[rna_seq_data$Tags %in% common_genes, ]

# 计算每个样本的mRNA干性指数

dryness_index <- apply(rna_seq_data_filtered[, -1], 2, function(sample_expr) {

  cor(dryness_weights_filtered$w, sample_expr, method = "spearman")

})

# 标准化干性指数到 [0,1] 的范围内

dryness_index_normalized <- (dryness_index - min(dryness_index)) / (max(dryness_index) - min(dryness_index))

# 输出结果

dryness_index_df <- data.frame(sample_id = names(dryness_index_normalized), dryness_index = dryness_index_normalized)

write.table(dryness_index_df, "dryness_index.txt", sep = "\t", quote = FALSE, row.names = FALSE)

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

玩转ChatGPT:R代码Debug一例_第13张图片

玩转ChatGPT:R代码Debug一例_第14张图片

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

三、写在最后

三点启示吧:

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

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

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

你可能感兴趣的:(玩转ChatGPT,chatgpt,r语言,python)