http://blog.csdn.net/helen1313/article/details/38041243
http://blog.csdn.net/yujunbeta/article/details/24142545
R 语言进行数据预处理
4.R 语言进行数据预处理
在实际情况下,数据通常是不完整(缺少属性值或某些感兴趣的属性,或仅包含聚集
数据)、含噪声(包含错误或存在偏离期望的离群值)、不一致的,这样的数据必须经过预
处理,剔除其中的噪声,回复数据的完整性和一致性后才能使用数据挖掘技术进行分析。
使用 mice 软件包中的示例数据 nhanes2 来进行演示。加载 mice 包前,要先加载
lattice,MASS, nnet 包:
install.packages("lattice")
install.packages("MASS")
install.packages("nnet")
library(lattice)
library(MASS)
library(nnet)
install.packages("mice")
library(mice)
data(nhanes2)
缺失值处理
判断是否存在缺失值:
> sum(is.na(nhanes2)) #计算 nhanes2 中缺失值数量
[1] 27
>
>sum(complete.cases(nhanes2)) #计算 nhanes2 中完整样本的数量
[1] 13
> md.pattern(nhanes2)
age hyp bmi chl
13 1 1 1 1 0
1 1 1 0 1 1
3 1 1 1 0 1
1 1 0 0 1 2
7 1 0 0 0 3
0 8 9 1027
其中 1 表示没有缺失数据,0 表示存在缺失数据。
1. 直接删除法
这种方法最为简单有效,但前提是缺失数据的比例较少,且缺失数据是随机出现的,这样删
除数据后对分析影响不大。
2. 随机插补法
从整体中随机抽取某个样本代替缺失样本。
> #随机插补法
> sub =which(is.na(nhanes2[,4]) == TRUE) #返回 nhanes2 数据集中第 4 列为 NA 的行
> dataTR =nhanes2[-sub,]
#将第 4 列不为 NA 的数据存数 dataTR 中
> dataTE =nhanes2[sub,]
#将第 4 列为 NA 的数据存入 dataTE
> dataTE[,4] =sample(dataTR[,4],length(dataTE[,4]),replace=T) #在非缺失值中简单抽样
> dataTE
age bmi hyp chl
1 20-39 NA 204
4 60-99 NA 187
10 40-59 NA 238
11 20-39 NA 187
12 40-59 NA 187
15 20-39 29.6 no 187
16 20-39 NA 187
20 60-99 25.5 yes 284
21 20-39 NA 204
24 60-99 24.9 no 238
3. 均值法
均值法通过计算缺失值所在变量所有非缺失值的均值,使用均值来代替缺失值。优点:不会
减少信息,处理简单;缺点:当缺失值数据不是随机出现时会产生偏差。
> #均值法
> sub =which(is.na(nhanes2[,4]) == TRUE) #返回 nhanes2 数据集中第 4 列为 NA 的行
> dataTR =nhanes2[-sub,]
#将第 4 列不为 NA 的数据存数 dataTR 中
> dataTE =nhanes2[sub,]
#将第 4 列为 NA 的数据存入 dataTE
> dataTE[,4] =mean(dataTR[,4]) #用非缺失值的均值代替缺失值
> dataTE
age bmi hyp
chl
1 20-39 NA 191.4
4 60-99 NA 191.4
10 40-59 NA 191.4
11 20-39 NA 191.4
12 40-59 NA 191.4
15 20-39 29.6 no
191.4
16 20-39 NA 191.4
20 60-99 25.5 yes
191.4
21 20-39 NA 191.4
24 60-99 24.9 no
191.4
4. 回归模型插补法
由于随机插补和均值插补中没有利用相关变量信息,因此会存在一定偏差,而回归模型是将
需要插补变量作为因变量,其他相关变量作为自变量,通过建立回归模型预测出因变量的值
对缺失变量进行插补。
> #回归模型插补法
> sub =which(is.na(nhanes2[,4]) == TRUE) #返回 nhanes2 数据集中第 4 列为 NA 的行
> dataTR =nhanes2[-sub,]
#将第 4 列不为 NA 的数据存数 dataTR 中
> dataTE =nhanes2[sub,]
#将第 4 列为 NA 的数据存入 dataTE
>
> lm =lm(chl~age,data=dataTR) #利用 dataTR 中 age 为自变量,chl 为因变量构建线性回
归模型 lm
> dataTE[,4] =round(predict(lm,dataTE)) #按模型 lm 对 dataTE 中的缺失值进行预测
> dataTE
age bmi hyp chl
1 20-39 NA 169
4 60-99 NA 225
10 40-59 NA 203
11 20-39 NA 169
12 40-59 NA 203
15 20-39 29.6 no 169
16 20-39 NA 169
20 60-99 25.5 yes 225
21 20-39 NA 169
24 60-99 24.9 no 225
5. 热平台插补
在非缺失值所在的样本中找到一个与缺失值所在样本相似的样本(匹配样本),利用其观测
值对缺失值进行插补。
> #热平台插补
> accept =nhanes2[which(apply(is.na(nhanes2),1,sum) !=0),] #存在缺失值的样本
> donate =nhanes2[which(apply(is.na(nhanes2),1,sum) ==0),] #不存在缺失值的样本
> accept[1,]
age bmi hyp chl
1 20-39 NA NA
> donate[1,]
age bmi hyp chl
2 40-59 22.7 no 187
上述程序按照样本中是否含有缺失值将 nhanes2 分成存在缺失值和无缺失值两个数据表。
对于 accept 中的每个样本,热平台插补就是在 donate 中找到与该样本相似的样本,用相似
样本的对应值代替该样本的缺失值。如,对于 accept 中的第二个样本,插补方法如下:
> #对 accept 第二个样本进行热平台插补
> accept[2,]
age bmi hyp chl
3 20-39 30.1 no 187
> sa
=donate[which(donate[,1]==accept[2,1]&donate[,3]==accept[2,3]&donate[,4]==accept[2,4]
),]
> sa
age bmi hyp chl
8 20-39 30.1 no 187
> accept[2,2] =sa[1,2] #用找到的样本替代缺失值
> accept[2,]
age bmi hyp chl
3 20-3930.1 no 187
实际操作中,尤其当变量数量很多时,通常很难找到与需要插补样本完全相同的样本,此时
可以看做某些变量将数据分成,在层中对缺失值进行均值插补,即采取冷平台插补方法。
6. 冷平台插补
> #5 冷平台插补
> level1<-nhanes2[which(nhanes2[,3]=="yes"),] #按照变量 hyp 分层
> level1
age bmi hyp chl
14 40-59 28.7 yes 204
17 60-99 27.2 yes 284
18 40-59 26.3 yes 199
20 60-99 25.5 yes NA
> level1[4,4] =mean(level1[1:3,4])
#用层内均值代替第 4 个样本缺失值
> level1
age bmi hyp chl
14 40-59 28.7 yes 204
17 60-99 27.2 yes 284
18 40-59 26.3 yes 199
20 60-99 25.5 yes 229
噪声数据处理
噪声是一个测量变量中的随机错误或偏差,包括错误值或偏离期望的孤立点值。在 R 中可
以通过调用 outliers 软件包中的 outlier 函数寻找噪声数据,该函数通过寻找数据集中与其他
观测值及均值差距最大的点作为异常值。
outlier(x, opposite = FALSE, logical =FALSE)
x: 一个数据,通常是一个向量,如果 x 输入的是一个数据框或矩阵,则 outlier 函数将逐列
算出;
opposite: 默认为 FALSE,当为 TRUE 时,给出相反值;