【发布时间】:2017-06-24 15:00:22
【问题描述】:
我正在尝试实现一个块引导程序,但我还没有找到有效的方法。
我的 data.frame 结构如下:
CHR POS var_A var_B
1 192 0.9 0.7
1 2000 0.8 0.3
2 3 0.21 0.76
2 30009 0.36 0.15
...
第一列是染色体标识,第二列是位置,最后两列是我要计算相关性的变量。问题是每一行并不完全相互独立,取决于它们之间的距离(越近越依赖),所以我不能简单地做cor(df$var_A, df$var_B)。
解决此类数据常用的问题的方法是执行块引导。也就是说,我需要将我的数据分成长度为 X 的块,在该块内随机选择一行,然后计算我感兴趣的统计量。但是请注意,这些块需要基于列 POS 定义,而不是基于行号。此外,需要对每条染色体执行此过程。
我试图实现这一点,但我想出了可能最慢的代码(它甚至没有完成运行),而且我不能 100% 确定它是否有效。
x = 1000
cors = numeric()
iter = 1000
for(j in 1:iter) {
df=freq[0,]
for (i in unique(freq$CHR)) {
t = freq[freq$CHR==i,]
fim = t[nrow(t),2]
i = t[1,2]
f = i + x
while(f < fim) {
rows = which(t$POS>=i & t$POS<f)
s = sample(rows)
df = rbind(df,t[s,])
i = f
f = f + x
}
}
cors = c(cors, cor(df$var_A, df$var_B))
}
有人可以帮帮我吗?我确信有一种更有效的方法来做到这一点。
提前谢谢你。
【问题讨论】:
-
如何在
POS上定义块? -
因为我需要根据基因组中的位置每 1kb 块采样一行。在某些情况下,我在这些 1kb 块内有不止一行,但在某些情况下不会发生这种情况。
-
你的代码有点混乱。基于上面的小数据示例,基于
POS的条件是什么才能选择一行? -
你必须沿着这些位置“走”,每 1kb 块采样一行。如果您的 POS 从 0 开始,那么您必须查找 [0,1000[ 范围内的行并采样一行。如果此块内没有行,则继续。如果只有一行,请保留。
标签: r bioinformatics genome