创建';结构化';R中的数据表中缺少数据

创建';结构化';R中的数据表中缺少数据,r,missing-data,genetics,R,Missing Data,Genetics,我和一位导师在实验室里做研究,他开发了一个分析遗传数据的模型,利用方差分析。我模拟了一个数据集,我想用它来评估我们的模型处理不同程度缺失数据的能力 我们的数据集由15个物种组成,每个物种有4个个体,我们将这些物种命名为“A”(x4)列、“B”(x4)列等。每行代表一个基因 我试图想出一个随机删除1%数据的代码,但每个物种至少有2个个体拥有有效数据,否则我们的模型就会退出(因为它是基于方差分析的) 我意识到这使得“随机”丢失的数据不那么随机,但我们正在尝试不同的方法。重要的是,丢失的数据必须随机

我和一位导师在实验室里做研究,他开发了一个分析遗传数据的模型,利用方差分析。我模拟了一个数据集,我想用它来评估我们的模型处理不同程度缺失数据的能力

我们的数据集由15个物种组成,每个物种有4个个体,我们将这些物种命名为“A”(x4)列、“B”(x4)列等。每行代表一个基因

我试图想出一个随机删除1%数据的代码,但每个物种至少有2个个体拥有有效数据,否则我们的模型就会退出(因为它是基于方差分析的)


我意识到这使得“随机”丢失的数据不那么随机,但我们正在尝试不同的方法。重要的是,丢失的数据必须随机。我希望有人能帮我设置这个

我试着做一个玩具的例子,也许会有帮助

is_valid_df<-function(df,col,val){
  all(table(df[col])>val)
}


filter_function<-function(df,perc,col,val){
  n=dim(df)[1]
  filter<-sample(1:n,n*perc)

  if(is_valid_df(df[-filter,],col,val)){
    return(df[-filter,])
  }else{
    filter_function(df,perc,col,val)
    cat("resampling\n")
  }
}




set.seed(20)
a<-(filter_function(iris,0.1,"Species",44))
有效吗
}

filter_function我试着做一个玩具的例子,可能会有帮助

is_valid_df<-function(df,col,val){
  all(table(df[col])>val)
}


filter_function<-function(df,perc,col,val){
  n=dim(df)[1]
  filter<-sample(1:n,n*perc)

  if(is_valid_df(df[-filter,],col,val)){
    return(df[-filter,])
  }else{
    filter_function(df,perc,col,val)
    cat("resampling\n")
  }
}




set.seed(20)
a<-(filter_function(iris,0.1,"Species",44))
有效吗
}

过滤功能您可以从每组中随机选择2个人,并“保护”他们不受1%随机删除的影响。例如,将它们移动到单独的
data.frame
中。在不知道您已经尝试了什么的情况下,很难给出编码建议。您可以编写一个函数(比如
is.valid
)来检查数据集是否有效(即每个物种至少有两个个体拥有有效数据),然后使用XFile循环运行另一个函数,随机删除数据,直到数据集有效(
is.valid
返回
TRUE
)它被命名为拒绝抽样,它是随机的,因为
is.valid
@AndreyKolyadin是的,我考虑过,但每个基因需要随机2个个体。我希望它尽可能随机。这意味着不是每个基因都有缺失数据,也不是每个物种都有一致的缺失数据在所有基因中,统计上每个个体至少有一个基因中有一个缺失数据。所以我不能保护两个个体,因为这不会使它变得随机。@Snake先生,这听起来是个不错的选择。我唯一关心的是,while循环不能删除规范中两个以上个体的数据ies,这将导致函数在达到1%缺失数据之前停止?您可以在删除每个数据后进行检查(使用另一个检查函数?通过存储物种名称?),但我认为时间会更长。您可以从每组中随机选择2个人并“保护”从你的1%随机删除中删除它们。例如,将它们移动到一个单独的
data.frame
。在不知道你已经尝试了什么的情况下,很难给出编码建议。你可以编写一个函数(比如
is.valid
)来检查数据集是否有效(即每个物种至少有两个具有有效数据的个体)然后使用XFile循环运行另一个循环,该循环随机删除数据,直到数据集有效(
is.valid
返回
TRUE
)它被命名为拒绝抽样,它是随机的,因为
is.valid
@AndreyKolyadin是的,我考虑过,但每个基因需要随机2个个体。我希望它尽可能随机。这意味着不是每个基因都有缺失数据,也不是每个物种都有一致的缺失数据在所有基因中,统计上每个个体至少有一个基因中有一个缺失数据。所以我不能保护两个个体,因为这不会使它变得随机。@Snake先生,这听起来是个不错的选择。我唯一关心的是,while循环不能删除规范中两个以上个体的数据ies,这将导致函数在达到1%丢失数据之前停止?您可以在删除每个数据后进行检查(使用另一个检查函数?通过存储物种名称?),但我认为它会更长。