R語(yǔ)言 用均值替換、回歸插補(bǔ)及多重插補(bǔ)進(jìn)行插補(bǔ)的操作
用均值替換、回歸插補(bǔ)及多重插補(bǔ)進(jìn)行插補(bǔ)
# 設(shè)置工作空間 # 把“數(shù)據(jù)及程序”文件夾拷貝到F盤下,再用setwd設(shè)置工作空間 setwd("E:\\R_workspace\\R語(yǔ)言數(shù)據(jù)分析與挖掘?qū)崙?zhàn)\\chp4") # 讀取銷售數(shù)據(jù)文件,提取標(biāo)題行 inputfile <- read.csv('./data/catering_sale.csv', header = TRUE) View(inputfile) # 變換變量名 inputfile <- data.frame(sales = inputfile$'銷量', date = inputfile$'日期') View(inputfile) # 數(shù)據(jù)截取 inputfile <- inputfile[5:16, ] View(inputfile) # 缺失數(shù)據(jù)的識(shí)別 is.na(inputfile) # 判斷是否存在缺失 n <- sum(is.na(inputfile)) # 輸出缺失值個(gè)數(shù) n # 異常值識(shí)別 par(mfrow = c(1, 2)) # 將繪圖窗口劃為1行兩列,同時(shí)顯示兩圖 dotchart(inputfile$sales) # 繪制單變量散點(diǎn)圖 boxplot(inputfile$sales, horizontal = TRUE) # 繪制水平箱形圖 # 異常數(shù)據(jù)處理 inputfile$sales[5] = NA # 將異常值處理成缺失值 fix(inputfile) # 表格形式呈現(xiàn)數(shù)據(jù) # 缺失值的處理 inputfile$date <- as.numeric(inputfile$date) # 將日期轉(zhuǎn)換成數(shù)值型變量 sub <- which(is.na(inputfile$sales)) # 識(shí)別缺失值所在行數(shù) sub # 將數(shù)據(jù)集分成完整數(shù)據(jù)和缺失數(shù)據(jù)兩部分 inputfile1 <- inputfile[-sub, ] inputfile2 <- inputfile[sub, ] # 行刪除法處理缺失,結(jié)果轉(zhuǎn)存 result1 <- inputfile1 View(result1) # 均值替換法處理缺失,結(jié)果轉(zhuǎn)存 avg_sales <- mean(inputfile1$sales) # 求變量未缺失部分的均值 avg_sales # 用均值替換缺失 inputfile2$sales <- rep(avg_sales,n) # 并入完成插補(bǔ)的數(shù)據(jù) result2 <- rbind(inputfile1, inputfile2) View(result2) # 回歸插補(bǔ)法處理缺失,結(jié)果轉(zhuǎn)存 # 回歸模型擬合 # 注意:因變量~自變量 model <- lm(sales ~ date, data = inputfile1) # 模型預(yù)測(cè) inputfile2$sales <- predict(model, inputfile2) result3 <- rbind(inputfile1, inputfile2) # 多重插補(bǔ)法處理缺失,結(jié)果轉(zhuǎn)存 library(lattice) # 調(diào)入函數(shù)包 library(MASS) library(nnet) library(mice) # 前三個(gè)包是mice的基礎(chǔ) # 4重插補(bǔ),即生成4個(gè)無(wú)缺失數(shù)據(jù)集 imp <- mice(inputfile, m = 4) # 選擇插補(bǔ)模型 # inputfile為原始數(shù)據(jù),有缺失 fit <- with(imp,lm(sales ~ date, data = inputfile)) # m重復(fù)完整數(shù)據(jù)分析結(jié)果池 pooled <- pool(fit) summary(pooled) result4 <- complete(imp, action = 3) # 選擇第三個(gè)插補(bǔ)數(shù)據(jù)集作為結(jié)果
補(bǔ)充:R語(yǔ)言數(shù)據(jù)缺失值處理(隨機(jī)森林,多重插補(bǔ))
缺失值是指數(shù)據(jù)由于種種因素導(dǎo)致的數(shù)據(jù)不完整,可以分為機(jī)械原因和人為原因。對(duì)于缺失值我們通常采用以下幾種方法來(lái)進(jìn)行插補(bǔ)。
1.讀取數(shù)據(jù)
通過(guò)read.csv函數(shù)導(dǎo)入文檔,也可以用其他函數(shù)讀入,如openxlsx::read.xlsx,read.table等。
head()查看數(shù)據(jù)前幾行。
airquality <- read.csv(data.csv) head(airquality)
2.檢查數(shù)據(jù)完整性
首先,summary()查看數(shù)據(jù)基本信息
summary(airairquality)
可以看到Ozone中存在缺失值NA
通過(guò)調(diào)用VIM::aggr()查看函數(shù)的缺失值(如果包安裝較慢,可選用本地安裝,鏈接已附需自行下載)
#install.packages(‘VIM') library(VIM) aggr(airquality)
通過(guò)上圖,可以看到Ozone和Solar.R存在缺失值。
3.缺失值填補(bǔ)
3.1簡(jiǎn)單處理填補(bǔ)
(1)刪除缺失值
若樣本中存在較少缺失值或缺失值比例較小不影響分析結(jié)果時(shí),可選擇直接將缺失值刪除。
dat1 <- na.omit(airquality)
(2)平均值、中位數(shù)填補(bǔ)
若不能直接將缺失值刪除也可選擇平均值、眾數(shù)、中位數(shù)等進(jìn)行填補(bǔ)
#平均值填補(bǔ) airquality$ Ozone[is.na(airquality$Ozone)] <- mean(airquality $ Ozone,na.rm=T) #中位數(shù)填補(bǔ) airquality$ Solar.R[is.na(airquality$ Solar.R)] <- median(airquality$ Solar.R,na.rm = T) #計(jì)算缺失值個(gè)數(shù),等于0 則不存在缺失值 sum(is.na(airquality)) #相鄰均值填補(bǔ) airquality <- read.csv(data.csv) #重新讀入數(shù)據(jù) for (i in 1:length(airquality$ Ozone)) { airquality$ Ozone[i] <- ifelse(is.na(airquality$ Ozone[i]), mean(c(airquality$ Ozone[i-1],airquality$ Ozone[i+1]),na.rm=T), airquality$ Ozone[i]) }
3.2復(fù)雜處理填補(bǔ)
(1)K-近鄰算法填補(bǔ)
基本思想:對(duì)于需要填補(bǔ)的觀測(cè)值,先利用歐氏距離找到其鄰近的K個(gè)觀測(cè),再將這K個(gè)鄰近的值進(jìn)行加權(quán)平均進(jìn)行填補(bǔ)。
原始數(shù)據(jù)中存在多個(gè)缺失值,可以利用DMwR包中的knnImputation()函數(shù)進(jìn)行填補(bǔ)
dat1 <- knnImputation(airquality[,c(1:4)],meth = ‘weighAvg',scale = T)
提取原始數(shù)據(jù)中的前4列進(jìn)行填補(bǔ),meth = 'weighAvg'指使用加權(quán)平均的方法進(jìn)行填補(bǔ),scale = T指在選取鄰近值時(shí),先對(duì)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化。
aggr(dat1) #查看缺失值分布
(2)隨機(jī)森林填補(bǔ)缺失值
接下來(lái)介紹一個(gè)新的填補(bǔ)方法–隨機(jī)森林填補(bǔ),隨機(jī)森林是機(jī)器學(xué)習(xí)中一種常見(jiàn)的方法,以決策樹(shù)為基分類的器的集成學(xué)習(xí)模型。
missForest包中missForest()函數(shù)可實(shí)現(xiàn)隨機(jī)森林填補(bǔ),ntree代表模型中的樹(shù)的棵數(shù),一般情況下,對(duì)于高維數(shù)據(jù)可選擇較小的值(如100),以達(dá)到快速插補(bǔ)的效果;對(duì)于大數(shù)據(jù)集進(jìn)行填補(bǔ)時(shí),可能耗時(shí)比較多。
library(missForest) dat2 <- missForest(airquality,ntree = 100)
dat2中包含填補(bǔ)好的數(shù)據(jù),可利用dat2$ximp查看填補(bǔ)后的值,
head(dat2$ximp) aggr(dat2$ximp)
同時(shí),OOBerror表示袋外填補(bǔ)缺失的誤差估計(jì)。
dat2$OOBerror
4.多重插補(bǔ)法
多重插補(bǔ)法是在一個(gè)缺失的數(shù)據(jù)集中生成一個(gè)完整的數(shù)據(jù)集,并利用蒙特卡洛的方法進(jìn)行填補(bǔ)的一種重復(fù)模擬的方法。
包mice中的mice()函數(shù)可實(shí)現(xiàn)對(duì)缺失數(shù)據(jù)的多重插補(bǔ),原數(shù)據(jù)集中Ozone和Solar.R變量存在缺失,采用‘rf'法插補(bǔ)。
dat3 <- mice(airquality,m=5,method = ‘rf')
其中,m為生成完整數(shù)據(jù)集的個(gè)數(shù),默認(rèn)為5. method為插補(bǔ)參數(shù)的方法,‘norm.predict'、‘pmm'、‘rf'、‘norm'依次為回歸預(yù)測(cè)法、平均值插補(bǔ)法、隨機(jī)森林法和高斯線性回歸法。
summary(dat3)
通過(guò)以下代碼可查看填補(bǔ)的值
dat3$ imp$Solar.R
最后選擇某一列(如1,2,3)填充到缺失數(shù)據(jù)集中即可形成完整的數(shù)據(jù)集.
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
R語(yǔ)言繪圖時(shí)輸出希臘字符上下標(biāo)及數(shù)學(xué)公式實(shí)現(xiàn)方法
這篇文章主要為大家介紹了R語(yǔ)言進(jìn)行繪圖時(shí)輸出希臘字符上標(biāo),下標(biāo)及數(shù)學(xué)公式的實(shí)現(xiàn)方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11R語(yǔ)言關(guān)聯(lián)規(guī)則深入詳解
這篇文章主要介紹了R語(yǔ)言關(guān)聯(lián)規(guī)則深入詳解,文中內(nèi)容講解的很透徹,有感興趣的同學(xué)可以學(xué)習(xí)下2021-03-03R語(yǔ)言數(shù)據(jù)可視化包ggplot2畫(huà)圖之散點(diǎn)圖的基本畫(huà)法
散點(diǎn)圖主要用于描述兩個(gè)連續(xù)變量之間的關(guān)系,通過(guò)散點(diǎn)圖發(fā)現(xiàn)變量之間的相關(guān)性強(qiáng)度、是否存在線性關(guān)系等,下面這篇文章主要給大家介紹了關(guān)于R語(yǔ)言數(shù)據(jù)可視化包ggplot2畫(huà)圖之散點(diǎn)圖的基本畫(huà)法,需要的朋友可以參考下2022-11-11R語(yǔ)言刷題檢驗(yàn)數(shù)據(jù)缺失類型過(guò)程詳解
這篇文章主要為大家介紹了R語(yǔ)言刷題中檢驗(yàn)數(shù)據(jù)缺失類型的過(guò)程示例分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11R語(yǔ)言隨機(jī)數(shù)生成的實(shí)現(xiàn)
這篇文章主要介紹了R語(yǔ)言隨機(jī)數(shù)生成的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03