NA 替换使用均值或中值?哪个对我的数据更好?
NA replacement using mean or median value? which will be better for my data?
我有以下数据集:
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)]
我感觉这不是正确的归因方式。
谁能帮我解惑:
- 是否会对中位数插补有任何影响,因为有些值频率较高,而另一些值频率较低。
- 由于异常值,使用 "mean" 进行插补并不是一个好主意。那么还有哪些替代方法呢?
谢谢。
对于第二点,您已经提出了方法。如果您担心异常值,则中位数插补比均值插补更合适。
至于第一点,对于给定的数据应该没有问题,因为中位数计算会丢弃大部分数据并关注中间的值。
这取决于数据的分布。如果有很多异常值,则使用中位数进行缺失值插补。
最好的就是做
数据是 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")
我有以下数据集:
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)]
我感觉这不是正确的归因方式。
谁能帮我解惑:
- 是否会对中位数插补有任何影响,因为有些值频率较高,而另一些值频率较低。
- 由于异常值,使用 "mean" 进行插补并不是一个好主意。那么还有哪些替代方法呢?
谢谢。
对于第二点,您已经提出了方法。如果您担心异常值,则中位数插补比均值插补更合适。
至于第一点,对于给定的数据应该没有问题,因为中位数计算会丢弃大部分数据并关注中间的值。
这取决于数据的分布。如果有很多异常值,则使用中位数进行缺失值插补。
最好的就是做
数据是 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")