【问题标题】:Fill missing value based on probability of occurrence根据发生概率填充缺失值
【发布时间】:2017-11-06 18:37:26
【问题描述】:

这就是我的 data.table/dataframe 的样子

library(data.table)
dt <- fread('
   STATE     ZIP      
   PA        19333        
   PA        19327        
   PA        19333        
   PA        NA        
   PA        19355
   PA        19333
   PA        NA
   PA        19355
   PA        NA     
')

ZIP 列中有三个缺失值。我想根据它们在数据集中出现的概率,用ZIPs 的非缺失样本值填充缺失值。例如,ZIP 19333 在数据集中出现 3 次,ZIP 19355 在数据集中出现两次,19327 出现一次。因此,ZIP 19333 在PA 的数据集中出现的概率为 50%,19355 的概率为 33.33%,19327 的概率为 16.17%。因此,19333 在尝试填补三个缺失的 ZIP 时被选中的概率最高。最终填充的数据集可能如下所示,其中两个缺失值由“19333”填充,一个由“19355”填充:

       STATE     ZIP      
       PA        19333        
       PA        19327        
       PA        19333        
       PA        19333       
       PA        19355
       PA        19333
       PA        19333
       PA        19355
       PA        19355    

我的数据集中有多个STATE。主要思想是根据给定STATE 出现 ZIP 的概率来填充缺失的 ZIP。

【问题讨论】:

  • 您是在询问您的代码或确定缺失值的方法吗?您是否拥有多个州的数据?我假设您不想为具有相同邮政编码的所有州填写所有缺失值。我有点不清楚你到底在问什么。
  • @MrFlick 感谢您的评论。我做了一些编辑。希望帖子现在更清楚了。

标签: r data.table missing-data


【解决方案1】:

这是一种仅使用 sample 的方法,封装在一个便利函数中。

sample_fill_na = function(x) {
    x_na = is.na(x)
    x[x_na] = sample(x[!x_na], size = sum(x_na), replace = TRUE)
    return(x)
}

dt[, ZIP := sample_fill_na(ZIP), by = STATE]

【讨论】:

  • 感谢您提供出色的解决方案。有时,示例函数可以为所有三个缺失值绘制 19355。有没有办法从非空 ZIP 样本中强制按比例抽取?
  • 它根据给定状态发生 ZIP 的概率随机抽样。比例填充没有很好的定义。您想如何填写以下示例? (1, 1, 2, 2, NA)? (1, 1, 1, 2, NA, NA)? (1, 2, 3, NA, NA)?等
  • 明白。谢谢!
  • 我建议阅读一些有关插补的内容 - 解决问题的一个好方法可能是重复您正在执行的任何分析n 次,每次使用不同的随机数据填充。比较结果的分布将量化您的结果对插补的敏感程度,并对它们进行平均将为您提供更可靠的估计。在任何一次运行中,您都可以使用set.seed() 来获得随机抽奖的可重复性(如果您想要不同的随机抽奖,请不要使用相同的种子!)。
猜你喜欢
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
相关资源
最近更新 更多