缺失值處理包括兩個步驟,即缺失數據的識別和缺失值處理。在R語言總缺失值以NA表示,可以使用函數is.na()判斷缺失值是否存在,函數complete.cases()可識別樣本數據是否完整從而判斷缺失情況。缺失值處理常用方法有刪除法、替換法、插補法。
(1)刪除法:可分為刪除觀測樣本與刪除變量。
刪除觀測樣本通過na.omit()函數移除所有含有缺失數據的行,屬於以減少樣本量來換取信息完整性的方法,適用於缺失值所含比例較小的情況。
刪除變量通過data[,-p]函數移除含有缺失數據的列,適用於變量有較大缺失且對研究目標影響不大的情況。
缺點:會存在信息浪費的問題,且數據結構會發生變動,以致最后得到有偏的統計結構
(2)替換法:變量按屬性可分為數值型和非數值型
缺失數據為數值型的一般用該變量在其他對象的取值均值來替換變量的缺失值
缺失數據為非數值型的一般用其他全部有效觀測值的中位數或者眾數來替換
缺點:會存在信息浪費的問題,且數據結構會發生變動,以致最后得到有偏的統計結構
(3)插補法:常用的插補方法有回歸插補,多重插補
回歸插補:利用回歸模型,將需要插補的變量作為因變量,其他相關變量作為自變量,通過回歸函數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) # 選擇第三個插補數據集作為結果