• Welcome to LiuJason's Blog!

使用R语言插入缺失数据-平均值法(附代码)

R语言 Jason 5 years ago (2018-11-29) 1111 Views 0 Comments

做实验嘛总会莫名其妙少掉一些样本,但是样本少了文章还是要写啊!那么缺失了数据对分析有什么影响呢?
我觉得最重要的影响应该是权重的变化,这里用我这次的实验数据做例子吧:
本实验是研究9个不同来源地(纬度梯度下)的植物凋落物分解速率的差异,同时还有3种不同的凋落物袋看分解者和来源地的交互作用,具体可以看这个poster:

Poster (draft) of [Relative Importance of Control Factors for Regulating Litter Decomposition Rate]

那么假如缺失的都是某一特定种类的凋落物袋,假设这一种类的凋落物袋条件下的分解速率实际上和其他的有差异,那么在比较来源地和分解者之间的交互效应的时候,有可能差异会被掩盖。
Emm....我现在脑子有点乱,总之缺了东西就要补回来!
那么开始吧:

RawData <- read.csv("IntegratedData.csv", header = T)[-1]
Species_list <- c("Ph", "Sp")
DRegion_list <- c("L", "M", "H")
MeshSize_list <- c("1", "20", "50")
count <- 0
data_insert <- RawData[0,]
for(a in Species_list){
  if(a == "Ph"){
    ORegion_list <- c("YK", "DY", "LY", "YC", "SH", "TZ", "FZ", "ZZ", "ZH")
  }else{
    ORegion_list <- c("TJ", "DY", "LY", "YC", "SH", "ND", "ZZ", "ZH", "LZ")
  }
  for(b in DRegion_list){
    for(c in MeshSize_list){
      for(d in ORegion_list){
        for(e in 1:5){
          data <- RawData[which(RawData$OriginRegion == d & 
                                   RawData$MeshSize == c & RawData$DecomposeRegion == b &
                                   RawData$Species == a & substr(RawData$OriginSite,5,5) == e),]
          if(nrow(data) == 0){
            print(paste("All samples are missing, info:", a, b, c, d, e))
          }else if(nrow(data) == 1){
            data_insert <- rbind(rbind(data_insert, data), data)
            count <- count + 2
            #print(paste("ERROR1", a, b, c, d, e))
          }else if(nrow(data) == 2){
            data_average <- RawData[0,]
            for(f in 1:63){
              if(is.numeric(data[1,f])){
                data_average[1,f] <- mean(data[,f])
              }else{
                data_average[1,f] <- data[1,f]
              }
            }
            data_insert <- rbind(data_insert, data_average)
            count <- count + 1
            #print(paste("ERROR2", a, b, c, d, e))
          }else if(nrow(data) == 4){
            #Remove abnormal sample
            #RawData <- RawData[which(RawData$SampleID != max(data[which.max(abs(data[,9]-mean(data[,9]))),"SampleID"])),]
            AbnormalID <- data[which.max(abs(data[,9]-mean(data[,9]))),"X"]
            RawData <- RawData[which(RawData[, "X"] != AbnormalID),]
            print(paste("ERROR3", AbnormalID))
          }else if(nrow(data) > 4){
            print(paste("Error4", a, b, c, d, e))
            print(data[, c(8, 9)])
          }
        }
      }
    }
  }
}
print(count)
InsertedData <- rbind(RawData, data_insert)
#write.csv(InsertedData, file = "InsertedData.csv")

具体的我就不一一解释了,不懂的可以留言问。
大致思路→我的实验中每一个处理组有3个重复,让R循环读取每一个处理组,如果:
1. 这个处理组里面没有数据说明3个都丢了,那么就直接报错(虽然并没有);
2. 这个处理组里面有1条数据说明2个丢了,那么直接复制这一条数据两遍,凑够3条数据;
3. 这个处理组里面有2条数据说明1个丢了,那么所有参数取平均数后插入这一条数据,凑够3条数据;
4. 这个处理组里面有3条数据说明数据都在,那么就直接跳过。


This article is under CC BY-NC-SA 4.0 license.
Please quote the original link:https://www.liujason.com/article/134.html
Like (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址