我(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;")
我非常感谢任何帮助(或类似线程的链接)来做到这一点。
答案 0 :(得分:1)
首先,您需要将数据融合为长格式,以便一列(您的X列)包含一个分类变量,指示观察是BL
,1Y
还是{{1 }}
(您的命令会创建一个空列,您可能需要先删除它:fold
)
genes$X = NULL
然后你需要不同列中的基因和测量(基线,1年,折叠)(来自this question)。
library(reshape2)
genes.long = melt(genes, id.vars='treatment', value.name='expression')
按照您期望的顺序进行测量:
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'))
调用绘制平均值和置信区间。使用facets分组(治疗和基因组合)。
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)
。