使用R语言进行单因素影响下的多组独立数据的比较

单因素影响下的多组独立数据的比较思路已在文章使用Python进行单因素影响下的多组独立数据的比较简单提及,此处不再重复说明。

R语言读取Excel数据要比python简单一些。如果在实验过程中已经将数据采集好,或者将数据整理成类似如下的格式:

对比10种不同的处理方式之间的差异

则可以直接用如下代码来读取该实验数据:

library(xlsx)
library(readxl)
dataframe <- read.xlsx(数据存储目录的字符串, sheetIndex=第几个工作簿, encoding="UTF-8")  
# read.xlsx还有好些其他参数,感兴趣可以自己搜索一下

并生成方便接下来统计的数据框:

df_melt <- reshape2::melt(dataframe, id.vars=colnames(dataframe)[1], variable.name="group", value.name="data")
# melt()函数可以指定数据框中哪些变量是id变量,哪些变量是测量值。可参考凌空的桨一文《R语言数据处理——表格转换

完成以上步骤,就可以开始进行统计分析了。


一、正态性检验

# 此处采用和prism8.0默认的正态检验法lillie检验
library(nortest)
group_name <- colnames(dataframe)[2:length(colnames(dataframe))]  # 获得列名
nor_re <- c()
for (i in 1:length(group_name)) {
  nor_p <- lillie.test(dataframe[,c(i+1)])$p.value
  if (nor_p > 0.1) {
    nor_re[i] <- T } else {
      nor_re[i] <- F
  }
}
print(nor_re)

二、方差齐性检验

# 此处采用和prism8.0相同的方差齐性检验法levene检验
library(car)
library(carData)
sd_test <- leveneTest(data~group, data = df_melt, center = 'mean')
print(sd_test)
print(class(sd_test$`Pr(>F)`[1]))

三、单因素方差分析

# 若数据服从正态分布及方差齐,则可采用单因素方差分析
anova <- aov(data~group, data=df_melt)
anova_result <- summary(anova)

四、非参数检验

# 若数据不服从正态分布,或虽然服从正态分布,但方差不齐,则应采用非参数比较kruskal检验
ckruskal <- kruskal.test(data~group, data=df_melt)
print(kruskal$p.value)  # 可提取检验结果中的p值

五、事后多重比较

# 单因素方差分析的事后多重比较用Tukey检验:
library(stats)
tukey_re <- TukeyHSD(anova)

# kruskal检验的事后多重比较用Dunn检验:
library(PMCMRplus)
dunn_re <- kwAllPairsDunnTest(data~group, data=df_melt, p.adjust.method = 'bonferroni')

六、代码总结

library(xlsx)
library(readxl)
dataframe <- read.xlsx(数据存储目录, sheetIndex=工作表索引, encoding="UTF-8")

df_melt <- reshape2::melt(dataframe, id.vars=colnames(dataframe)[1], variable.name="group", value.name="data")

# 正态性检验与结果汇总
library(nortest)
group_name <- colnames(dataframe)[2:length(colnames(dataframe))]  # 获得列名
nor_re <- c()
for (i in 1:length(group_name)) {
  # print(group_name[i])
  nor_p <- lillie.test(dataframe[,c(i+1)])$p.value
  # print(nor_p)
  if (nor_p > 0.1) {
    nor_re[i] <- T } else {
      nor_re[i] <- F
  }
}
print(nor_re)

# 正态性检验结果检查
if (FALSE %in% nor_re) {
  print(FALSE) 
  } else {
    print(TRUE)
}

# 方差齐性检验
library(car)
library(carData)
sd_test <- leveneTest(data~group, data = df_melt, center = 'mean')
print(sd_test)
print(class(sd_test$`Pr(>F)`[1]))

#单因素方差分析
anova <- aov(data~group, data=df_melt)
anova_result <- summary(anova)

# 事后多重比较
library(stats)
tukey_re <- TukeyHSD(anova)
print(tukey_re)

# 非参数检验
kruskal <- kruskal.test(data~group, data=df_melt)
print(kruskal$p.value)


# 非参数检验多重比较
library(PMCMRplus)
dunn_re <- kwAllPairsDunnTest(data~group, data=df_melt, p.adjust.method = 'bonferroni')
print(dunn_re)  # 非配对,非参数检验,和prism结论一致

类似文章