【问题标题】:simulate x percentage of missing and error in data in r模拟 r 中数据中缺失和错误的 x 百分比
【发布时间】:2014-08-29 15:17:51
【问题描述】:

我想对关于 10 K x 50 K 的相当大的数据集执行两件事。以下是较小的200 x 10000 集。

首先我想生成 5% 的缺失值,这可能很简单,可以通过简单的技巧来完成:

# dummy data 
set.seed(123)
# matrix of X variable 
xmat <- matrix(sample(0:4, 2000000, replace = TRUE), ncol = 10000)
colnames(xmat) <- paste ("M", 1:10000, sep ="")
rownames(xmat) <- paste("sample", 1:200, sep = "")

在数据中 5% 的随机位置生成缺失值。

N <- 2000000*0.05 # 5% random missing values 
inds_miss <- round ( runif(N, 1, length(xmat)) )
xmat[inds_miss] <- NA

现在我想生成错误(意味着与上面矩阵中的值不同。上面的矩阵的值是 0 到 4。所以我想做的是:

(1) 我想用另一个不是 x 的值替换 x 值(例如 0 可以替换为非 0 的随机样本(即 1 或 2 或 3 或 4),类似地 1 可以替换为非 1(即 0 或 2 或 3 或 4)。可以简单地替换随机值的指标:

  inds_err <- round ( runif(N, 1, length(xmat)) )

如果我随机采样 0:4 值并用索引替换,这有时会用相同的值替换相同的值(0 与 0、1 与 1 等等)而不会产生错误。

errorg <- sample(0:4, length(inds_err), replace = TRUE)
xmat[inds_err] <- errorg

(2) 所以我想做的是在 xmat 中引入缺失值的错误,但是我不希望在上述步骤中生成的 NA 被替换为值(0 到 4)。所以ind_err 不应该是向量inds_miss 的成员。

总结规则

(1) 缺失值不应替换为错误值

(2) 必须用不同的值替换现有值(这里是错误的定义)-在随机抽样中,这样做的概率为 1/5。

怎么做?我需要可以在我的大型数据集中使用的更快的解决方案。

【问题讨论】:

    标签: r loops missing-data


    【解决方案1】:

    你可以试试这个:

        inds_err <- setdiff(round ( runif(2*N, 1, length(xmat)) ),inds_miss)[1:N]
        xmat[inds_err]<-(xmat[inds_err]+sample(4,N,replace=TRUE))%%5
    

    使用第一行生成2*N 可能的错误索引,然后减去属于inds_miss 的索引,然后取第一个 N。第二行添加到要更改的值之间的随机数1 和 4,然后取 mod 5。这样你就可以确定新的值会与原来的不同,并且仍然在 0-4 范围内。

    【讨论】:

      【解决方案2】:

      这是一个适合您的 if/else 解决方案。这是一个 for 循环,所以不确定这是否适合您。可能将其矢量化是使其更快的某种方式。

      # vector of options
      vec <- 0:4
      
      # simple logic based solution if just don't want NA changed
      for(i in 1:length(inds_err){
        if(is.na(xmat[i])){
          next
        }else{
          xmat[i] <- sample(vec[-xmat[i]], 1)
        }
      }
      

      【讨论】:

      • 没有什么“等于”NA。您显然是 R 新手。请在发布之前测试您的代码。
      • @BondedDust,这暗示要附加到他现有的代码中。显然,在我的代码中,有几个对象本身甚至都不存在。放松一下。
      • 您的代码在语法和语义上不正确。它会抛出一个错误来测试某些东西与 NA 的相等性。告诉我“冷静下来”并不能改变这一点。
      • 对于其他阅读本文的人,== 已更改为 is.na 以使其正常工作。
      猜你喜欢
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 2018-12-06
      • 2019-08-07
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      • 2019-05-22
      相关资源
      最近更新 更多