从今天开始要记录自己的学习笔记啦~~~ 2020.3.5
缺失值的处理方法——多重插补法
1 基本思想
利用蒙特卡洛模拟法(MCMC)将原始数据插补成几个完整数据集,在每个数据集中利用线性回归(lm)或广义线性规格(glm)等方法进行插补建模,再将这些完整的模型整合到一起,评价插补模型的优劣并返回完整数据集。该方法主要利用程辑包mice中的mice(
)进行。
大致步骤如下:
缺失数据集——MCMC估计插补成几个数据集——每个数据集进行插补建模(glm、lm模型)——将这些模型整合到一起(pool)——评价插补模型优劣(模型系数的t统计量)——输出完整数据集(compute)
2 mice函数基本书写格式
R语言输入help(mice)可获取详细信息
mice( data, m=5, method=vetor(“charater”,length=ncol(data)),
seed=NA,defaultMethod=c(“pmm”,“logger”,“polyreg”,“poor”)…)
data:一个包含完整数据和缺失数据的矩阵或数据框
m:指定的多重插补数,默认值为5
method:一个字符串,或者长度与数据集列数相同的字符串向量,用于指定数据中的每一列采用的插补方法,单一字符串指定所有列用相同的方法插补,字符串向量指定不同列采用不同的方法插补,默认插补法取决于需要插补的目标列,并由defaultMethod指定参数
seed:一个整数,用于函数set.seed( )的参数,默认值为NA
defaultMethod:一个向量,用于指定每个数据集采用的插补建模方法,可供选择的方法有多种,"pmm"表示用预测的均值匹配,"logreg"表示用逻辑回归拟合,“polyreg"表示多项式拟合,“polr“表示采用比例优势模型拟合等。
3 、应用举例
>install.packages("DMwR") >library(DMwR) >data(algae) >sum(is.na(algae)) #缺失值判断
>install.packages("mice") >library(mice) >imp<-mice(algae[,4:11],seed=1234)
#创建一个imp对象,使用的数据为algae数据集中含有缺失值的第4到11行数据,默认插补数据集为5个 >fit<-with(imp,lm(mxPH~.,
data=algae[,4:11]) #fit对象用于设定统计方法 >pool=pool(fit) #对统计分析结果进行汇总 >options(digits=3
) #设定输出结果保留3个小数 >summary(pool) #用summary函数显示pool的统计信息 >imp$imp$C1
#查看变量C1在五个插补数据集中的插补结果>imp$method #查看每个变量所用的插补方法 >algea_compelete=complete(imp,
action=1) #使用函数complete( )返回五个插补数据集中指定的任意一个数据集,这里返回的插补数据集中第一个 >sum(is.na(
algae_complete)) #查看插补的第一个数据集是否还有缺失值 >par(mfrow=c(3,3)) #调用函数par( )
为设置的R图形的系统参数,这里将图形输出设置为3*3的格式,即一个图版显示3行3列 >stripplot(imp,pch=c(1,8),col=c("grey"
,"1") #利用mice包中的函数stripplot( )对变量分布图进行可视化,其中包含插补数据 >par(mfrow=c(1,1))
#画完图后将窗口重新设置为1*1的格式
4、FAQ(也就是我学习中遇到的问题)
1)函数lm( )中点“."代表什么?
lm(mxPH ~ ., data = algae[,4:11]) 中 mxPH ~ . 这个formula会被lm()解读成在给定数据表中以mxPH
为被解释变量,其他列为解释变量做线性回归模型,在变量很多的情况下可以简化代码,但风险是数据列变化时回归方程也跟着变,有些类似于SQL中使用 select *
的风险。
2)seed(1234)在插补中有什么用处?
seed是一个整数,用于函数set.seed(
)的参数,指定产生固定的随机数的个数。括号里的数只是一个编号而已,例如set.seed(100)不应将括号里的数字理解成“一百”,而是应该理解成“编号为一零零的随机数发生”。用于设定随机数种子,一个特定的种子可以产生一个特定的伪随机序列,这个函数的主要目的,是让你的模拟能够可重复出现,因为很多时候我们需要取随机数,但这段代码再跑一次的时候,结果就不一样了,如果需要重复出现同样的模拟结果的话,就可以用set.seed()。在调试程序或者做展示的时候,结果的可重复性是很重要的,所以随机数种子也就很有必要。