R 用中位数或平均值替换缺失值

R 用中位数或平均值替换缺失值,r,R,我一直在尝试各种时间序列插补模型,用imputeTS插补缺失的时间序列,但测试结果很差。因为它看起来像季节性的时间序列数据,我想简单地用几个月的中位数或平均值来插补缺失的值 数据如下所示: > head(data, 10) v1 v2 v3 v4 1 1908 1 118 10 2 1908 2 138 33 3 1908 3 128 17 4 1908 4 NA 60 5 1908 5 NA 114 6 1908 6 72 124 7

我一直在尝试各种时间序列插补模型,用
imputeTS
插补缺失的时间序列,但测试结果很差。因为它看起来像季节性的时间序列数据,我想简单地用几个月的中位数或平均值来插补缺失的值

数据如下所示:

> head(data, 10)
     v1 v2  v3  v4
1  1908  1 118  10
2  1908  2 138  33
3  1908  3 128  17
4  1908  4  NA  60
5  1908  5  NA 114
6  1908  6  72 124
7  1908  7  NA  44
8  1908  8  70 134
9  1908  9  58 121
10 1908 10  42 117
我计算了中值:

data %>%
  as_tibble() %>%
  group_by(v2) %>%
  summarise(imp_v3 = median(v3, na.rm = TRUE),
            imp_v4 = median(v4, na.rm = TRUE))
其中:

# A tibble: 12 x 3
      v2 imp_v3 imp_v4
   <int>  <dbl>  <dbl>
 1     1  126     23  
 2     2  132     27.5
 3     3  138     33  
 4     4   22.5   76  
 5     5   42.5  102. 
 6     6   72    127  
 7     7   82     50  
 8     8   80     51  
 9     9   57    121  
10    10   24     98  
11    11  145     71  
12    12  130.    31 

我们可以使用
replace
NA
元素替换为列的
median

library(dplyr)
data %>%
    group_by(v2) %>% 
    mutate_at(vars(v3, v4), list(~ replace(., is.na(.), median(., na.rm = TRUE))))
# A tibble: 443 x 4
# Groups:   v2 [12]
#      v1    v2    v3    v4
#   <int> <int> <dbl> <dbl>
# 1  1908     1 118      10
# 2  1908     2 138      33
# 3  1908     3 128      17
# 4  1908     4  22.5    60
# 5  1908     5  42.5   114
# 6  1908     6  72     124
# 7  1908     7  82      44
# 8  1908     8  70     134
# 9  1908     9  58     121
#10  1908    10  42     117
# … with 433 more rows
默认情况下,
FUN
mean
。如果我们想要
median
指定
FUN

data %>%
   group_by(v2) %>%
   mutate_at(vars(v3, v4), na.aggregate, FUN = median)
library(zoo)
data %>%
   group_by(v2) %>%
   mutate_at(vars(v3, v4), na.aggregate)
data %>%
   group_by(v2) %>%
   mutate_at(vars(v3, v4), na.aggregate, FUN = median)