模拟R中的缺失数据(即掩模数据)以测试插补精度

时间:2013-06-01 00:48:17

标签: r masking simulate missing-data cross-validation

我想使用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来:

  1. 掩盖10%的已知 SNP共10次不同时间(即10轮掩蔽)。

  2. 每轮需要掩盖一组不同的SNP。

  3. 每个 SNP只应在这10轮中被屏蔽一次(例如,SNP S10_28619在整个10轮屏蔽中仅显示为“NA”一次)。

  4. 这是我一直在使用的代码:

    ##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)
    }
    

1 个答案:

答案 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"

注意其中一个已经NAbeagle.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