缺失值處理包括兩個步驟,即缺失數據的識別和缺失值處理。在R語言總缺失值以NA表示,可使用函數is.na()判斷缺失值是否存在,函數complete.cases()可識別樣本數據是否完整從而判斷缺失狀況。缺失值處理經常使用方法有刪除法、替換法、插補法。數據結構
(1)刪除法:可分爲刪除觀測樣本與刪除變量。函數
刪除觀測樣本經過na.omit()函數移除全部含有缺失數據的行,屬於以減小樣本量來換取信息完整性的方法,適用於缺失值所含比例較小的狀況。對象
刪除變量經過data[,-p]函數移除含有缺失數據的列,適用於變量有較大缺失且對研究目標影響不大的狀況。input
缺點:會存在信息浪費的問題,且數據結構會發生變更,以至最後獲得有偏的統計結構it
(2)替換法:變量按屬性可分爲數值型和非數值型io
缺失數據爲數值型的通常用該變量在其餘對象的取值均值來替換變量的缺失值基礎
缺失數據爲非數值型的通常用其餘所有有效觀測值的中位數或者衆數來替換變量
缺點:會存在信息浪費的問題,且數據結構會發生變更,以至最後獲得有偏的統計結構date
(3)插補法:經常使用的插補方法有迴歸插補,多重插補file
迴歸插補:利用迴歸模型,將須要插補的變量做爲因變量,其餘相關變量做爲自變量,經過迴歸函數lm()預測出因變量的值來對缺失變量進行補缺
多重插補:是從一個包含缺失值的數據集中生成一組完整的數據,如此屢次,從而產生缺失值的一組隨機樣本,R中的mice()函數能夠用來進行多重插補。
# 設置工做空間
setwd("F:/數據及程序/chapter4/示例程序/data")
# 讀取銷售數據文件,提取標題行
inputfile <- read.csv('1.csv', header = TRUE)
# 變換變量名
inputfile <- data.frame(sales = inputfile$'銷量', date = inputfile$'日期')
# 數據截取
inputfile <- inputfile[5:16, ]
# 缺失數據的識別
is.na(inputfile) # 判斷是否存在缺失
n <- sum(is.na(inputfile)) # 輸出缺失值個數
# 異常值識別
par(mfrow = c(1, 2)) # 將繪圖窗口劃爲1行兩列,同時顯示兩圖
dotchart(inputfile$sales) # 繪製單變量散點圖
boxplot(inputfile$sales, horizontal = TRUE) # 繪製水平箱形圖
# 異常數據處理
inputfile$sales[5] = NA # 將異常值處理成缺失值
fix(inputfile) # 表格形式呈現數據
# 缺失值的處理
inputfile$date <- as.numeric(inputfile$date) # 將日期轉換成數值型變量
sub <- which(is.na(inputfile$sales)) # 識別缺失值所在行數
inputfile1 <- inputfile[-sub, ] # 將數據集分紅完整數據和缺失數據兩部分
inputfile2 <- inputfile[sub, ]
# 行刪除法處理缺失,結果轉存
result1 <- inputfile1
# 均值替換法處理缺失,結果轉存
avg_sales <- mean(inputfile1$sales) # 求變量未缺失部分的均值
inputfile2$sales <- rep(avg_sales,n) # 用均值替換缺失
result2 <- rbind(inputfile1, inputfile2) # 併入完成插補的數據
# 迴歸插補法處理缺失,結果轉存
model <- lm(sales ~ date, data = inputfile1) # 迴歸模型擬合
inputfile2$sales <- predict(model, inputfile2) # 模型預測
result3 <- rbind(inputfile1, inputfile2)
# 多重插補法處理缺失,結果轉存library(lattice) # 調入函數包library(MASS)library(nnet)library(mice) # 前三個包是mice的基礎imp <- mice(inputfile, m = 4) # 4重插補,即生成4個完好失數據集fit <- with(imp,lm(sales ~ date, data = inputfile)) # 選擇插補模型pooled <- pool(fit)summary(pooled)result4 <- complete(imp, action = 3) # 選擇第三個插補數據集做爲結果