在資料分析中,我們會經常遇到缺失值問題。一般的缺失值的處理方法有刪除法和填補法。通過刪除法,我們可以刪除缺失資料的樣本或者變數。而缺失值填補法又可分為單變數填補法和多變數填補法,其中單變數填補法又可分為隨機填補法、中位元/中值填補法、迴歸填補法等。本文簡單介紹一下如何在R語言中利用mice包對缺失值進行迴歸填補。
假設未經處理資料只有兩列P(壓力)和T(溫度),具體資料如下:
orig_data <- data.frame( T = c(0.47, 0.45, 0.48, 0.47, 0.41, 0.56, 0.54, 0.51, 0.44, 0.56, NA, 0.62, 0.5, 0.43, NA, NA, 0.69, 0.73, 0.45, 0.43, 0.38, 0.35, 0.5, 0.46, 0.41, 0.43, 0.41, NA, 0.8, 0.51, NA, 0.44, NA, 0.43, 0.45, 0.77, 0.41, 0.77, 0.47, 0.63, 0.43, NA, NA, 0.47, NA, 0.25, 0.48, 0.49, 0.46, 0.72, NA, 0.36, NA, 0.45, 0.41, 0.36, 0.48, 0.4, 0.44, 0.73, 0.8, 0.45, 0.47, 0.54, 0.5, 0.5, 0.48, 0.44, NA, 0.42, 0.34, 0.45, NA, 0.42, 0.42, 0.42, 0.42, 0.52, 0.44, 0.56, NA, 0.52, 0.44, 0.5, NA, 0.46, 0.42, 0.42, 0.35, 0.3, NA, 0.49, 0.53, 0.62, 0.48, 0.44, 0.48, 0.48, 0.45, 0.43, 0.43, 0.47, NA, 0.48, 0.69, 0.62, 0.45, 0.4, NA, 0.9, 0.7, 0.37, 0.66, 0.36, 0.76, 0.83, 0.44, 0.33, 0.46, 0.46, 0.43, 0.45, NA, 0.46, 0.43, 0.44, 0.52, 0.48, 0.44, 0.37, 0.47, 0.47), P = c(4650, 3720, 2050, 5600, 1420, 5299.6, 6714, 3858, 3731, 3331, NA, 3800, 2190, 2800, NA, NA, 7135, 6817, 2264, 4490, 2359, 889, 3572, 4978, 3800, 1735, 2092, 4200, 6840, 2381, 250, 6637, NA, 1434, 3122, 11542, 1075, 12075, 5027, 3640, 2026, 4551, NA, 4551, NA, 927, 2727, 4400, 925, 10800, NA, 1894, 1514, 1987, 2741, 2788, 4490, 2375, 4772, 5490, 3190, 4177, 3490, 5660, 5750, 6220, 4345, 3983, 850, 4300, 2459, 2074, 2450, 3350, 3002, 3350, 3002, 1263, 2969, 827, NA, 5613, 3272, 3360, 2600, 3599, 288, 653, 2062, 1300, NA, 4439, 4218, 4057, 1242, 4722, 2731, 3100, 2245, 2340, 3387, 2367, NA, 6301, 3565, 9500, 9137, 2282, 2521, 11600, 7134, 2684, 4254, 1628, 5400, 6550, 3692, 2200, 980, 980, 1162, 3145, NA, 2117, 3390, 4365, 800, 2250, 2915, 2929, 4229, 5830))
調用mice包的md函數可以看到未經處理資料中的缺失值模式。下表中1和0是缺失值模式:0表示變數中的列有缺失值,1表示沒有缺失值。在未經處理資料中,P列缺失11個資料,T列缺失19個資料,兩列資料都缺失的資料點有11個,兩列資料都沒有缺失的資料點有113個。我們還可以利用VIM包中的scattMiss()函數或者aggr()函數繪製缺失資料的散佈圖。
library(mice)md.pattern(orig_data) P T 113 1 1 0 8 1 0 1 11 0 0 2 11 19 30library("VIM") aggr(orig_data, prop = T, numbers = T)上述代碼顯示的缺失值分布圖如下。從圖中可以看出T資料列的缺失比例大約為14%(0.14),P列的缺失比例大約為8.3%,兩列都缺失的資料占整個資料量的8.3%。
對於兩個資料都缺失的 11個資料點,我們無法利用迴歸的方法對它們進行填補。但是對於有一個值缺失的資料點,我們可以利用迴歸填補法進行缺失值充填。因為P和T這個兩個變數存在某種程度的線性相關。我們可以對這兩個變數進行線性迴歸,以觀察它們之間的線性關係。具體R代碼如下。
plot(orig_data)linear_model <- lm(P ~ T, data = orig_data)abline(linear_model,col="red")summary(linear_model)上面代碼輸出結果如下。Call:lm(formula = P ~ T, data = orig_data)Residuals: Min 1Q Median 3Q Max -4616.3 -1244.2 -2.6 766.6 5905.8 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -2651.1 712.2 -3.722 0.000312 ***T 13071.9 1411.4 9.262 1.79e-15 ***---Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 1762 on 111 degrees of freedom (19 observations deleted due to missingness)Multiple R-squared: 0.4359,Adjusted R-squared: 0.4308 F-statistic: 85.78 on 1 and 111 DF, p-value: 1.79e-15
P和T進行線性迴歸後的R2為0.43。因此我們可以運行下面代碼,利用線性迴歸方程對缺失的T值進行填補。
#首先載入sqldf包,將資料全部缺失的樣本給排除掉library(sqldf)temp_data <-sqldf("select T, P from orig_data where T is not null or P is not null",row.names=TRUE)#利用mice包填補在T列的缺失值imp <- mice(temp_data,seed=3231)fit_new <- with(imp,linear_model )pooled <- pool(fit_new)#獲得新產生的資料new_data <- complete(imp,action=3)#將未經處理資料和新資料進行並排比較total_data <- cbind(temp_data,new_data)colnames(total_data) <- c("original_T","original_P","new_T","new_P")total_data新產生的資料和原始的資料的比較結果如下: original_T original_P new_T new_P
1 0.47 4650.0 0.47 4650.0
2 0.45 3720.0 0.45 3720.0
3 0.48 2050.0 0.48 2050.0
4 0.47 5600.0 0.47 5600.0
5 0.41 1420.0 0.41 1420.0
6 0.56 5299.6 0.56 5299.6
7 0.54 6714.0 0.54 6714.0
8 0.51 3858.0 0.51 3858.0
9 0.44 3731.0 0.44 3731.0
10 0.56 3331.0 0.56 3331.0
11 0.62 3800.0 0.62 3800.0
12 0.50 2190.0 0.50 2190.0
13 0.43 2800.0 0.43 2800.0
14 0.69 7135.0 0.69 7135.0
15 0.73 6817.0 0.73 6817.0
16 0.45 2264.0 0.45 2264.0
17 0.43 4490.0 0.43 4490.0
18 0.38 2359.0 0.38 2359.0
19 0.35 889.0 0.35 889.0
20 0.50 3572.0 0.50 3572.0
21 0.46 4978.0 0.46 4978.0
22 0.41 3800.0 0.41 3800.0
23 0.43 1735.0 0.43 1735.0
24 0.41 2092.0 0.41 2092.0
25 NA 4200.0 0.47 4200.0
26 0.80 6840.0 0.80 6840.0
27 0.51 2381.0 0.51 2381.0
28 NA 250.0 0.35 250.0
29 0.44 6637.0 0.44 6637.0
30 0.43 1434.0 0.43 1434.0
31 0.45 3122.0 0.45 3122.0
32 0.77 11542.0 0.77 11542.0
33 0.41 1075.0 0.41 1075.0
34 0.77 12075.0 0.77 12075.0
35 0.47 5027.0 0.47 5027.0
36 0.63 3640.0 0.63 3640.0
37 0.43 2026.0 0.43 2026.0
38 NA 4551.0 0.44 4551.0
39 0.47 4551.0 0.47 4551.0
40 0.25 927.0 0.25 927.0
41 0.48 2727.0 0.48 2727.0
42 0.49 4400.0 0.49 4400.0
43 0.46 925.0 0.46 925.0
44 0.72 10800.0 0.72 10800.0
45 0.36 1894.0 0.36 1894.0
46 NA 1514.0 0.43 1514.0
47 0.45 1987.0 0.45 1987.0
48 0.41 2741.0 0.41 2741.0
49 0.36 2788.0 0.36 2788.0
50 0.48 4490.0 0.48 4490.0
51 0.40 2375.0 0.40 2375.0
52 0.44 4772.0 0.44 4772.0
53 0.73 5490.0 0.73 5490.0
54 0.80 3190.0 0.80 3190.0
55 0.45 4177.0 0.45 4177.0
56 0.47 3490.0 0.47 3490.0
57 0.54 5660.0 0.54 5660.0
58 0.50 5750.0 0.50 5750.0
59 0.50 6220.0 0.50 6220.0
60 0.48 4345.0 0.48 4345.0
61 0.44 3983.0 0.44 3983.0
62 NA 850.0 0.25 850.0
63 0.42 4300.0 0.42 4300.0
64 0.34 2459.0 0.34 2459.0
65 0.45 2074.0 0.45 2074.0
66 NA 2450.0 0.48 2450.0
67 0.42 3350.0 0.42 3350.0
68 0.42 3002.0 0.42 3002.0
69 0.42 3350.0 0.42 3350.0
70 0.42 3002.0 0.42 3002.0
71 0.52 1263.0 0.52 1263.0
72 0.44 2969.0 0.44 2969.0
73 0.56 827.0 0.56 827.0
74 0.52 5613.0 0.52 5613.0
75 0.44 3272.0 0.44 3272.0
76 0.50 3360.0 0.50 3360.0
77 NA 2600.0 0.43 2600.0
78 0.46 3599.0 0.46 3599.0
79 0.42 288.0 0.42 288.0
80 0.42 653.0 0.42 653.0
81 0.35 2062.0 0.35 2062.0
82 0.30 1300.0 0.30 1300.0
83 0.49 4439.0 0.49 4439.0
84 0.53 4218.0 0.53 4218.0
85 0.62 4057.0 0.62 4057.0
86 0.48 1242.0 0.48 1242.0
87 0.44 4722.0 0.44 4722.0
88 0.48 2731.0 0.48 2731.0
89 0.48 3100.0 0.48 3100.0
90 0.45 2245.0 0.45 2245.0
91 0.43 2340.0 0.43 2340.0
92 0.43 3387.0 0.43 3387.0
93 0.47 2367.0 0.47 2367.0
94 0.48 6301.0 0.48 6301.0
95 0.69 3565.0 0.69 3565.0
96 0.62 9500.0 0.62 9500.0
97 0.45 9137.0 0.45 9137.0
98 0.40 2282.0 0.40 2282.0
99 NA 2521.0 0.36 2521.0
100 0.90 11600.0 0.90 11600.0
101 0.70 7134.0 0.70 7134.0
102 0.37 2684.0 0.37 2684.0
103 0.66 4254.0 0.66 4254.0
104 0.36 1628.0 0.36 1628.0
105 0.76 5400.0 0.76 5400.0
106 0.83 6550.0 0.83 6550.0
107 0.44 3692.0 0.44 3692.0
108 0.33 2200.0 0.33 2200.0
109 0.46 980.0 0.46 980.0
110 0.46 980.0 0.46 980.0
111 0.43 1162.0 0.43 1162.0
112 0.45 3145.0 0.45 3145.0
113 0.46 2117.0 0.46 2117.0
114 0.43 3390.0 0.43 3390.0
115 0.44 4365.0 0.44 4365.0
116 0.52 800.0 0.52 800.0
117 0.48 2250.0 0.48 2250.0
118 0.44 2915.0 0.44 2915.0
119 0.37 2929.0 0.37 2929.0
120 0.47 4229.0 0.47 4229.0
121 0.47 5830.0 0.47 5830.0