数据填补

在数据收集的时候,不可避免的会有些样本的表型(特征)会丢失或者无法测量,如果想保证数据表的完整就要涉及数据的填补。
对于连续型数据来说,取一列数据的平均值作为填补是最简单的,但是很容易造成数据方差有偏,无法还原真实数据情况。
对于分类型舒俱来说,取一列中的众数作为填补是最简单的,但是无法还原真实数据情况。
此时,使用机器学习方法对缺失数据进行预测是一种比较好的方法。最常用的方法包括 KNN(K-邻近法),RF(随机森林)。两种方法的学习不含缺失值的列(回归)来预测缺失列进行填补。
在实际测试的时候,有文献说明使用随机森林方法填补缺失值更加准确,随之而来的是数据量变大,程序运行时间增加的更多。

R 包 missForest 的使用

1
2
3
4
data(iris)
iris.mis <- prodNA(iris, noNA = 0.2) #随机删除数据20%
iris.imp <- missForest(iris.mis, xtrue = iris, verbose = TRUE) #填补
iris.imp$OOBerror #准确度(NRMSE是连续性数据指标,PFC是分类型数据指标)

R 包 missMDA 的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
data(orange)
nb <- estim_ncpPCA(orange,ncp.max=5) #估计维数
res.comp <- imputePCA(orange,ncp=nb) #填补连续数据
res.comp$completeObs #结果

data(vnf)
nb <- estim_ncpMCA(vnf,ncp.max=5)
res.impute <- imputeMCA(vnf, ncp=nb)#填补分类数据
res.impute$completeObs #结果

data(ozone)
nb <- estim_ncpFAMD(ozone)
res.impute <- imputeFAMD(ozone, ncp=nb)#填补混合数据
res.impute$completeObs #结果

基因型填补

基因型填补相对于普通数据填补要困难,常用的软件有 begle(HMM) 和 linkimputeR(KNN)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
java -jar begle.jar  gt=test.vcf ne=1000 out=imputation.vcf # ne 有效种群大小

>>>cat accuracy.ini
[Input]
filename = test.vcf
save = filtered.vcf

[InputFilters]
maf=0.05
positionmissing = 0.8
exacthw=0.01

[Global]
depth = 2

[Stats]
root = ./
level = table
eachmasked = yes

[Output]
control = ./impute.xml

[Log]
file = log.txt
level = debug

[Accuracy]
numbermasked = 1000
>>>java -jar LinkImputeR.jar -s accuracy.ini
>>>java -jar LinkImputeR.jar impute.xml 'Case 1' result.vcf