r语言 - 使用平均值或中值进行NA替换?这对我的数据会更好



我有以下数据集:

5   3   3   5   10  10  3   8   2   12  8   6   2   5   6   5   10  4   3   5   4   3   3   5   8   3   5   6   6   1   10  3   6   6   5   8   3   4   3   4   4   3   2.5 1   4   2   2   3   5   10  4   4   6   3   2   3   8   3   4   4   3   3   4   8   4   4   2   4   4   3   2   10  6   3   7   3   5   3   1   4   3   4   3   4   4   2   3   2   4   7   4   6   3.5 3.5 5   3   4   3   5   3   1.5 2.5 3   7   2   5   3   4   2   4   5   3   4   5   4.5 4   6   3   2   1   3   2   2   3   4   6   2   4   2   3   6   1.5 3   3   1   4   3   3   2   3   2   2   6   3   15  1   4   5   2   6   2   4   8   2   8   4   4   4   3   8   4   4   8.5 3   2   7   0.5 3   3   3   2   3   2   4   5   6   2   3.5 3   3   2   2   2.5 2   2   5   2   8   2   4   3   3   2   7   2   4   2   4   4   3   2.5 3   3   3   5 NA NA NA NA NA  NA NA NA NA NA NA NA NA NA NA

我想使用平均值或中值插补方法替换 NA。

在这种情况下,哪种方法合适,为什么?

请帮助我学习。

谢谢。

在 R 中,我正在使用以下方法尝试对中位数进行相同的操作:

# replacing with Median
df$val[is.na(df$val)] <- with(df, 
                                  ave(val, FUN = function(x) 
                                            median(x, na.rm = TRUE)) [is.na(df$val)]

我有一种感觉,这不是正确的归因方式。

有人可以帮助澄清我的疑虑:

  1. 是否会对中位数插补产生任何影响,因为有些值具有高频,而另一些值具有低频率。
  2. 由于异常值,用"平均值"插补不是一个好主意。那么还有什么替代方法呢?

谢谢。

这取决于数据的分布。 如果有许多外线,请使用中位数进行缺失值插补。

最好的是做

数据是 DF$val

df2$val=na.omit(df$val)
summary(df2$val)
hist(df2$val)

然后

按均值替换

df$val=ifelse(is.na(df$val),mean(df$val,na.rm=T),df$val)

替换为中位数

df$val=ifelse(is.na(df$val),median(df$val,na.rm=T),df$val)

对于你的第二点,你已经提出了方法。如果您担心异常值,中位数插补将比均值插补更合适。

至于第一点,对于给出的数据来说应该不是问题,因为中位数计算会抛出大部分数据并专注于中间的值。

对于大多数数据集来说,平均值和中位数是最差的插补方法之一。(当然总是取决于数据集,也有这些可以的数据集(

通常,为了获得最佳插补结果,您需要研究变量之间的相关性或一个变量在时间上的相关性。

因此,查看整个数据帧会很有趣(以查看是否存在相关性(

如果您只想用平均值或中位数进行插补,这里有一些快速方法

#mean
library("imputeTS")
na.mean(df$val, option ="mean")
#median
library("imputeTS")
na.mean(df$val, option ="median")

最新更新