我想使用SNP基因型数据确定程序的插补精度,因此我需要屏蔽一部分SNP调用来模拟缺失的数据。
我一直在测试这个标记数据子集的代码(见下文)。列名是个人的名字。行名称是SNP ID。数据集包含缺失的数据(标记为NA)。
SNPID AR124 AR124 AR144 AR144
[1,] "S10_28619" "G" "A" "A" "A"
[2,] "S10_33499" "A" "A" "G" "G"
[3,] "S10_47747" "T" "T" NA NA
我想使用10倍交叉验证来确定插补精度,因此我需要R来:
掩盖10%的已知 SNP共10次不同时间(即10轮掩蔽)。
每轮需要掩盖一组不同的SNP。
每个 SNP只应在这10轮中被屏蔽一次(例如,SNP S10_28619在整个10轮屏蔽中仅显示为“NA”一次)。
这是我一直在使用的代码:
##the function will return the marker matrix with an additional 10% missing data
CV10NA= function (input, seed, foldno) {#input is the SNP matrix, seed is the random number seed, fold number is a number indicating which cross validation fold you are on
set.seed(seed)
a = unlist(input)
b = is.na(a) #matrix b where TRUE indicates missing SNP and FALSE indicates known SNP
pres = grep(FALSE, b) #finds cases of FALSE in matrix b and gives an integer vector containing the FALSEs' index numbers
sets= sample(rep(1:10, c(length(pres)/10)), replace = FALSE) #repeat numbers 1 through 10 a total of length(pres)/10) times then randomly sample from values with no replacement
a[which(sets==foldno)] = NA #find where sets==foldno in matrix a and replace it with NA
a = matrix(a, ncol = ncol(input))
return(a)
}
该函数似乎适用于foldno = 1到9,但在foldno = 10时不起作用。没有出现错误消息。注意:在执行函数之前,我删除了列和行名称,以防止函数将它们视为“可屏蔽”项。
这是foldno = 1,2,3和10的输出:
> CV10NA(beagle.subset, 1, 1)
[,1] [,2] [,3] [,4]
[1,] "G" "A" "A" NA
[2,] "A" "A" "G" "G"
[3,] "T" "T" NA NA
> CV10NA(beagle.subset, 1, 2)
[,1] [,2] [,3] [,4]
[1,] "G" "A" "A" "A"
[2,] "A" NA "G" "G"
[3,] "T" "T" NA NA
> CV10NA(beagle.subset, 1, 3)
[,1] [,2] [,3] [,4]
[1,] NA "A" "A" "A"
[2,] "A" "A" "G" "G"
[3,] "T" "T" NA NA
> CV10NA(beagle.subset, 1, 10)
[,1] [,2] [,3] [,4]
[1,] "G" "A" "A" "A"
[2,] "A" "A" "G" "G"
[3,] "T" "T" NA NA
foldno = 10不会屏蔽数据集中的任何SNP。
任何建议/反馈将不胜感激! 我没有编程经验,所以请原谅我,如果我犯了一个明显的错误或者问一个“愚蠢”的问题。
其他尝试/想法: 我尝试通过逐行运行来调试代码,但没有任何结果。我用另一个随机种子号运行代码,问题似乎不涉及我分配给foldno的值。无论foldno和种子数如何,矩阵[2,4]中的SNP都不会掩盖。
对于任何有兴趣的人,这是我用于屏蔽的修订代码:
CV10NA= function (input, seed, foldno) {
set.seed(seed)
a = unlist(input)
b = is.na(a)
pres = grep(FALSE, b)
pres = sample(pres)
sets= sample(rep(1:10, length(pres)/10), replace = FALSE)
a[pres[which(sets==foldno)]] = NA
a = matrix(a, ncol = ncol(input))
enter code here
return(a)
}
答案 0 :(得分:1)
所以sets
是数字1-10的排列,例如:
3 4 5 7 2 8 9 6 10 1
并且您想要找出等于折叠数的值的索引:
which(sets==foldno)
问题是,这只会返回1-10范围内的数字。因此,以下是beagle.subset
中可能设置为NA的值:
> beagle.subset[1:10]
[1] "G" "A" "T" "A" "A" "T" "A" "G" NA "A"
注意其中一个已经NA
! beagle.subset[2,4]
无法受到影响,因为它位于索引11处。相反,beagle.subset[3,3]
将再次设置为NA
。
我认为不是改组1-10,而是要改变非NA
的索引。然后,您可以为每个值分配1-10,基本上将它们放入十个箱中。
pres = sample(pres)
bins = seq_along(pres) %% 10 + 1
a[pres[bins == foldno]] = NA