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

做实验嘛总会莫名其妙少掉一些样本,但是样本少了文章还是要写啊!那么缺失了数据对分析有什么影响呢?
我觉得最重要的影响应该是权重的变化,这里用我这次的实验数据做例子吧:
本实验是研究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
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy