我有以下数据集:
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)]
我有一种感觉,这不是正确的归因方式。
有人可以帮助澄清我的疑虑:
- 是否会对中位数插补产生任何影响,因为有些值具有高频,而另一些值具有低频率。
- 由于异常值,用"平均值"插补不是一个好主意。那么还有什么替代方法呢?
谢谢。
这取决于数据的分布。 如果有许多外线,请使用中位数进行缺失值插补。
最好的是做
数据是 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")