安装TDIP
NADIA包是TDIP包的依赖之一,但这个包目前已从cran上移除了,需要自行下载,然后从本地安装
https://cran.r-project.org/src/contrib/Archive/NADIA/
安装过程中可能还会提示缺少一些依赖,总之原则上提示缺少什么就安装什么
"mlr3", "mlr3pipelines", "paradox", "missMDA", "mlr3learners", "Amelia", "softImpute", "missRanger")) install.packages(c(
从github安装TDIP包
devtools::install_github("Matgend/TDIP")
数据
加载TDIP包
library(TDIP)
# 加载包中自带的数据集
data(dataframe)
# 设置参数树,包含三个参数:0.4, 0.1和100
param_tree <- list(0.4, 0.1, 100)
# 使用data_simulator函数生成模拟数据
param_tree参数指定参数树
dataframe参数使用加载的数据集
simData <- data_simulator(param_tree = param_tree, dataframe = dataframe)
# 打印模拟数据的前几行
$FinalData 是模拟生成的最终数据集 simData
FinalData)
# I1.0/1 I2.0/1 I3.0/1 I4.0/1 F1.0/3 F2.0/3 F3.0/3 I1.0/4 I2.0/4 I3.0/4 F1.1/2 F2.1/2 F3.1/2
# t23 2 1 2 1 0.203913671 -1.6171502 -0.3472887 2 2 0 1.13084411 0.388191354 1.974841
# t24 2 1 2 1 0.569097928 -0.7370138 -0.1325044 2 2 0 0.26796591 -0.113133721 1.921079
# t5 0 1 1 1 -0.003254024 0.5929791 -1.4368104 1 1 2 0.37160420 0.562254863 1.591107
# t49 2 1 1 1 -0.308026821 0.6998594 0.2602554 0 2 0 -0.82149229 0.524967048 2.310056
# t7 2 1 1 1 0.735442781 -0.1129450 -0.7334719 2 2 0 -0.03072779 -0.007397889 2.186394
# t64 2 1 1 1 1.209052247 -0.8816450 -0.4864245 0 2 0 -1.01605308 0.287524388 1.256216
data(simulatedData)
data(tree)
simulatedData$Species <- rownames(simulatedData)
empData <- data_preprocessing(simulatedData, empTree = NULL, save = NULL)
empData <- data_preprocessing(simulatedData, empTree = tree, save = NULL)
缺失值的生成
# 设置缺失值比率为5%
missingRate <- 0.05
# 生成完全随机缺失(MCAR)数据
# 使用mcar_miss_meca函数在simData$FinalData的所有列中生成MCAR缺失值
mcar_values <- mcar_miss_meca(missingRate = missingRate,
ds = simData$FinalData,
cols_mis = 1:ncol(simData$FinalData))
# 生成随机缺失(MAR)数据
# 使用mar_miss_meca函数在simData$FinalData的第1列生成MAR缺失值,基于第3列的值
mar_values <- mar_miss_meca(missingRate = missingRate,
ds = simData$FinalData,
cols_mis = 1,
cols_ctrl = 3)
# 生成非随机缺失(MNAR)数据
# 使用mnar_miss_meca函数在simData$FinalData的所有列中生成MNAR缺失值
mnar_values <- mnar_miss_meca(missingRate = missingRate,
ds = simData$FinalData,
cols_mis = colnames(simData$FinalData))
# 生成基于系统发育关系的缺失(PhyloNa)数据
# 使用phyloNa_miss_meca函数在simData$FinalData中生成基于系统发育树的缺失值
phyloNa_values <- phyloNa_miss_meca(missingRate = missingRate,
ds = simData$FinalData,
tree = simData$TreeList$`0`)
# 使用na_insertion函数生成缺失值
missing_values <- na_insertion(
missingRate = missingRate, # 缺失值比率
dataset = simData$FinalData, # 完整数据集
missingTraits = ncol(simData$FinalData), # 要生成缺失值的特征总数
MARTraits = 1, # MAR机制中生成缺失值的变量
MARctrlTraits = 3, # MAR机制中控制缺失值的变量
traitsNoNA = NULL, # 不生成缺失值的特征
tree = simData$TreeList$`0`, # 系统发育树
save = NULL # 不保存结果到文件
)
# 可视化缺失数据
library(visdat)
NaData <- missing_values$DataNaN
# 遍历NaData中的每个分区并绘制缺失数据图
for(rdn in 1:length(NaData)){
partition <- NaData[[rdn]][[1]] # 获取当前分区
title <- names(partition) # 获取分区名称作为图表标题
plot(visdat::vis_miss(partition), main = title) # 使用vis_miss绘制缺失数据图
}
缺失值插补
# 定义一个包含三种插补方法的字符向量
methods <- c("mice_phylo", "missForest_phylo", "kNN_phylo")
# 设置插补策略为"NP"(非系统发育)
strategies <- "NP"
# 设置方差分数为0.95,表示系统发育树特征向量解释的方差比例
varfrac <- 0.95
# 调用missing_data_imputation函数进行缺失数据插补
imputedData <- missing_data_imputation(ImputationApproachesNames = methods, # 指定使用的插补方法
data = missing_values$DataNaN$MCAR$`MCAR/13/0.05`, # 输入包含缺失值的数据集,这里使用完全随机缺失(MCAR)的数据
tree = simData$TreeList$`0`, # 输入系统发育树对象
strategies = strategies, # 指定插补策略
varfrac = varfrac, # 设置方差分数
save = NULL)# 设置save参数为NULL,表示不保存结果到文件
imputedData
硬投票
# 从imputedData对象中选择特定的插补数据集
namesMethods <- c("MICE", "MissForest", "KNN") # 定义插补方法的名称
namesToselect <- paste(namesMethods, "NP", sep = "_") # 创建要选择的数据集名称
namesImputedData <- names(imputedData) # 获取imputedData对象中所有数据集的名称
datasets <- imputedData[which(namesImputedData %in% namesToselect)] # 选择指定的数据集
# 执行硬投票
hv <- hard_voting(listOfdataframe = datasets) # 对选定的数据集应用硬投票方法
hv
误差计算
# 计算包含由 missForest 插补的 MCAR 的数据的误差
errors <- imputation_error(imputedData = imputedData$MissForest_NP, # 使用missForest方法插补后的数据集
trueData = simData$FinalData, # 原始完整数据集
missingData = missing_values$DataNaN$MCAR$`MCAR/13/0.05`, # 包含MCAR缺失值的数据集
imputationApproachesName = methods[2], # 插补方法名称
dataframe = simData$Dataframe) # 用于模拟的数据框
errors
## trait missForest_phylo
## 1 I1.0/1 0.0000000
## 2 I2.0/1 0.0000000
## 3 I3.0/1 0.6000000
## 4 I4.0/1 0.4000000
## 5 F1.0/3 0.8053965
## 6 F2.0/3 0.6036047
## 7 F3.0/3 0.6121908
## 8 I1.0/4 0.4000000
## 9 I2.0/4 0.0000000
## 10 I3.0/4 0.6000000
## 11 F1.1/2 0.5367540
## 12 F2.1/2 0.6819793
## 13 F3.1/2 0.6687828
参考来源
Gendre, M., Hauffe, T., Pimiento, C., & Silvestro, D. (2024). Benchmarking imputation methods for categorical biological data. Methods in Ecology and Evolution, 00, 1–15. https://doi.org/10.1111/2041-210X.14339