做实验嘛总会莫名其妙少掉一些样本,但是样本少了文章还是要写啊!那么缺失了数据对分析有什么影响呢?
我觉得最重要的影响应该是权重的变化,这里用我这次的实验数据做例子吧:
本实验是研究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条数据说明数据都在,那么就直接跳过。