3

我(R 的新手)正在分析一项关于两种治疗对基因表达影响的随机研究。我们在基线和 1 年后评估了 5 个不同的基因。基因倍数计算为 1 年的值除以基线值。

示例基因:IL10_BL IL10_1Y IL10_fold

基因表达被测量为一个连续变量,通常在 0.1 到 5.0 之间。100 名患者被随机分配至他汀类药物或饮食方案。

我想做以下图: - Y 轴应显示具有 95% 置信限的平均基因表达 - X 轴应该是分类的,具有 5 个基因中每个基因的基线、1 年和倍数值,按治疗分组。因此,两组中每个基因有 3 个值的 5 个基因意味着 X 轴上的 30 个类别。如果同一个基因的点用一条线连接起来,那就太好了。

我自己尝试过这样做(使用ggplot2)但没有成功。我试图直接从原始数据中进行操作,看起来像这样(前 6 个观察结果和 2 个不同的基因):

    genes <- read.table(header=TRUE, sep=";", text = 
    "treatment;IL10_BL;IL10_1Y;IL10_fold;IL6_BL;IL6_1Y;IL6_fold;
    diet;1.1;1.5;1.4;1.4;1.4;1.1;
    statin;2.5;3.3;1.3;2.7;3.1;1.1;
    statin;3.2;4.0;1.3;1.5;1.6;1.1;
    diet;3.8;4.4;1.2;3.0;2.9;0.9;
    statin;1.1;3.1;2.8;1.0;1.0;1.0;
    diet;3.0;6.0;2.0;2.0;1.0;0.5;")

我将不胜感激任何帮助(或链接到类似线程)来做到这一点。

4

1 回答 1

1

首先,您需要将数据融合为长格式,以便一列(您的 X 列)包含一个分类变量,指示观察值是BL1Y还是fold

(您的命令会创建一个空列,您可能需要先删除genes$X = NULL:)

library(reshape2)
genes.long = melt(genes, id.vars='treatment', value.name='expression')

然后你需要不同列中的基因和测量值(基线,1年,折叠)(来自这个问题)。

genes.long$gene = as.character(lapply(strsplit(as.character(genes.long$variable), split='_'), '[', 1))
genes.long$measurement = as.character(lapply(strsplit(as.character(genes.long$variable), split='_'), '[', 2))

并按照您期望的顺序进行测量:

genes.long$measurement = factor(genes.long$measurement, levels=c('BL', '1Y', 'fold'))

stat_summary()然后,您可以使用均值和置信区间的调用进行绘图。使用方面来分隔组(治疗和基因组合)。

ggplot(genes.long, aes(measurement, expression)) + 
stat_summary(fun.y = mean, geom='point') + 
stat_summary(fun.data = 'mean_cl_boot', geom='errorbar', width=.25) +
facet_grid(.~treatment+gene)

基因

facet_grid(.~gene+treatment)如果您希望顶层是基因而不是治疗,您可以将顺序颠倒过来。

于 2014-08-09T19:17:54.373 回答