楼主: premandhi
22824 6

[程序分享] [显著性字母快速标记] 单因素方差分析+duncan多重比较 [推广有奖]

  • 0关注
  • 0粉丝

初中生

0%

还不是VIP/贵宾

-

威望
0
论坛币
12 个
通用积分
8.0000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
116 点
帖子
3
精华
0
在线时间
18 小时
注册时间
2016-5-26
最后登录
2022-3-5

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
这是Windows下的程序,在Mac上使用需要将两处"clipboard"替换为pipe("pbcopy")pipe("pbpaste;echo")。在OS X 10.8.5,R3.2.1,Excel for Mac 2011(14.5.1)下测试可用。

使用方法:
联网安装程序包agricolae:install.packages("agricolae")
引用程序代码:把.R文件拖入R窗口,Enter
1.在Excel中复制数据区域,不用粘贴
2.回到R,运行f()或者f(0.01)
3.查看分析结果,并在Excel中粘贴出字母标记



程序文件源码(Duncan[16-3-4]-Windows.R):
  1. ##
  2. ##   FGM 2016-3-4
  3. ##
  4. ##   单因素方差分析+duncan多重比较 快速标记字母 (for Windows)
  5. ##
  6. ##   for Mac: 将两处"clipboard"替换为pipe("pbcopy")和pipe("pbpaste;echo")
  7. ##   帮助: fgh()
  8. ##

  9. library(agricolae)


  10. copy_to_clipboard = function(x,sep="\t",col.names=T,...) {
  11.   write.table(x
  12.               ,file = "clipboard"    # Mac:  pipe("pbcopy")
  13.               ,sep=sep
  14.               ,col.names = col.names
  15.               ,row.names = F
  16.               ,quote = F,...)
  17. }

  18. paste_from_clipboard = function(sep="\t",header=T,...) {      
  19.   read.table("clipboard"     # Mac:  pipe("pbpaste;echo")
  20.              ,sep=sep
  21.              ,header=header,...)
  22. }


  23. fgh <- function() {
  24.   cat("\n",rep("#",5),"单因素方差分析+duncan多重比较   alpha默认=【0.05】\n ")  
  25.   cat(rep("#",5),"Help:fgh()\tUSAGE:\t从Excel复制纯数据区域,运行:f()或f(alpha值),粘贴字母标记结果回Excel;\n",rep("#",5),"\t\t\t数据分组:【按行】;    字母标记:【降序】;\n")
  26. }


  27. f <- function(fgalpha = 0.05) {
  28.   fgh()  
  29.   
  30.   dff = paste_from_clipboard(header = FALSE)
  31.   cat("\n\n")
  32.   cat("水平数:", nrow(dff))
  33.   cat("\t重复数:", ncol(dff),"\n")
  34.   
  35.   x <- as.vector(t(dff))
  36.   ### 数据若按列分组则为:as.vector(as.matrix(dff))
  37.   
  38.   level = factor(rep(1:nrow(dff),each=ncol(dff)))
  39.   df = data.frame(x,level)
  40.   resultaov = aov(x~level,data=df)
  41.   duncanresult = duncan.test(resultaov,"level",console = TRUE, alpha = fgalpha)
  42.   
  43.   de=as.data.frame(duncanresult["groups"])
  44.   de=de[order(de[,1]), ]
  45.   copy_to_clipboard(as.data.frame( de[,3]) ,col.names = FALSE)

  46.   cat("\n\n",rep("#",30),"\n",rep("#",5), " 已复制字母标记(按原数据区域顺序)到剪贴板。 ",rep("#",5),"\n",rep("#",30),"\n\n")
  47.   
  48. }


  49. fgh()
复制代码


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:单因素方差分析 duncan 方差分析 多重比较 单因素 字母标记

沙发
彩霞crystal 发表于 2016-5-26 12:48:20 来自手机 |只看作者 |坛友微信交流群
谢谢分享

使用道具

藤椅
zengqd_1985 发表于 2017-10-9 14:53:36 |只看作者 |坛友微信交流群
请问,能不能给个excel数据格式的截图呢,我用了一下会报错:Error in `[.data.frame`(de, , 3) : undefined columns selected

使用道具

板凳
premandhi 发表于 2017-12-25 17:52:33 |只看作者 |坛友微信交流群
zengqd_1985 发表于 2017-10-9 14:53
请问,能不能给个excel数据格式的截图呢,我用了一下会报错:Error in `[.data.frame`(de, , 3) : undefine ...
我今天重装R后也发现了这个问题,可能是agricolae或相关组件版本更新后导致输出丢失了1列引起的,修正后我会再贴上源码... 代码在5楼,现在应该没问题了

使用道具

报纸
premandhi 发表于 2017-12-25 18:53:51 |只看作者 |坛友微信交流群
修正了新版本agricolae程序包(1.2-7及以上)不能适用的bug, 并增加了特性(自动安装依赖包,不指定alpha值则进行0.05和0.01水平比较并合并两个结果,新参数:记住上次复制到剪贴板的数据,新参数:转换为大写字母):
  1. ##   
  2. ##   单因素方差分析+Duncan多重比较 快速标记字母 (for Windows)
  3. ##
  4. ##   Mac OS X: 将两处"clipboard"替换为pipe("pbcopy")和pipe("pbpaste;echo"),见注释
  5. ##   
  6. ##   测试环境:R: 3.2.1 ; 程序包:agricolae 1.2-8 ; Windows XP
  7. ##            
  8. ##   帮助: fhelp()     
  9. ##
  10. ##   FGM 2018-1-25  why_fish@126.com
  11. ##   
  12. ##


  13. ##检测并安装“agricolae”
  14. fgm_required_pkg="agricolae"
  15. if(!fgm_required_pkg %in% rownames(installed.packages())){
  16.   message("没有找到需要的程辑包:", fgm_required_pkg,",准备开始安装...    要自行安装请键入“install.packages(\"", fgm_required_pkg, "\")”。\n\n")
  17.   install.packages(fgm_required_pkg)
  18. }

  19. library(agricolae)
  20. lstAgricolaeVer = packageVersion ("agricolae")
  21. global_com_fgm_duncanalm_lastreaddata=NA

  22. if (lstAgricolaeVer > "1.2.8"){
  23.   message("警告:程辑包‘agricolae’", as.character(lstAgricolaeVer), "版本过高,脚本可能无法支持( 大于'1.2-8' )\n\n")
  24. }



  25. copy_to_clipboard = function(x,sep="\t",col.names=T,...) {
  26.   write.table(x
  27.               ,file = "clipboard"    # Mac:  pipe("pbcopy")
  28.               ,sep=sep
  29.               ,col.names = col.names
  30.               ,row.names = F
  31.               ,quote = F,...)
  32. }

  33. paste_from_clipboard = function(sep="\t",header=T,...) {      
  34.   read.table("clipboard"     # Mac:  pipe("pbpaste;echo")
  35.              ,sep=sep
  36.              ,header=header,...)
  37. }


  38. fhelp <- function() {
  39.   cat("\n",rep("#",2),"单因素方差分析+Duncan多重比较\n ")  
  40.   cat(rep("#",2),"使用方法: 从Excel复制纯数据区域,键入f()(或参考下面示例),回车执行,粘贴字母标记结果回Excel;\n",rep("#",2),"数据分组:【按行】;    字母标记:【降序】;\n",rep("#",2),"\n ")
  41.   cat(rep("#",2),"例 (注意大小写,使用英文标点):\n ")
  42.   cat(rep("#",2),"f()   得到在alpha=0.05和0.01两个水平上比较的结果\n ")
  43.   cat(rep("#",2),"f(0.01)   0.01水平上比较(自动转为大写字母)\n ")
  44.   cat(rep("#",2),"f(alpha = 0.01, uselastdata = TRUE)   使用上次从Excel复制进剪贴板的数据再在0.01水平上比较\n ")
  45.   cat(rep("#",2),"f(alpha = 0.02, uppercase = TRUE)   使用“uppercase = TRUE”指定输出结果为大写字母\n ")
  46.   cat(rep("#",2),"fhelp()   显示帮助\n ")
  47. }


  48. com_fgm_duncanalm_getmarks <- function(fgm_resultaov, fgm_level, fgconsole = TRUE, fgalpha = 0.05) {
  49.   
  50.   duncanresult = duncan.test(fgm_resultaov,fgm_level,console=fgconsole, alpha=fgalpha)
  51.   de=as.data.frame(duncanresult["groups"])
  52.   
  53.   if (lstAgricolaeVer >= "1.2.7"){
  54.     deres=de[order(as.integer(row.names(de))), ]
  55.     deres=as.data.frame( deres[,"groups.groups"])
  56.   }else{
  57.     deres=de[order(de[,"groups.trt"]), ]
  58.     deres=as.data.frame( deres[,"groups.M"])
  59.     ### fixed a bug:  旧版本的agricolae包适用
  60.   }
  61.   return(deres)
  62.   
  63. }


  64. f <- function(alpha = 0.05, uselastdata = FALSE, uppercase = NA) {
  65.   
  66.   if(uselastdata==FALSE){
  67.     global_com_fgm_duncanalm_lastreaddata <<- paste_from_clipboard(header = FALSE)
  68.   }  
  69.   dff = global_com_fgm_duncanalm_lastreaddata
  70.   cat("\n\n")
  71.   cat("处理的水平数:", nrow(dff))
  72.   cat("\t重复数:", ncol(dff),"\n")
  73.   
  74.   x <- as.vector(t(dff))
  75.   ### 数据若按列分组则为:as.vector(as.matrix(dff))
  76.   
  77.   level = factor(rep(1:nrow(dff),each=ncol(dff)))
  78.   df = data.frame(x,level)
  79.   resultaov = aov(x~level,data=df)
  80.   
  81.   if(missing(alpha)) {
  82.     ## 默认: 执行0.05(小写字母)和0.01(大写字母),合并结果
  83.     detocopy1 = com_fgm_duncanalm_getmarks(resultaov,"level",fgconsole = TRUE, fgalpha = 0.05)
  84.     detocopy = com_fgm_duncanalm_getmarks(resultaov,"level",fgconsole = TRUE, fgalpha = 0.01)
  85.     detocopy[,1] = toupper(detocopy[,1])
  86.     detocopy[,1] = paste0(detocopy1[,1] , detocopy[,1])
  87.   }else{
  88.     detocopy = com_fgm_duncanalm_getmarks(resultaov,"level",fgconsole = TRUE, fgalpha = alpha)
  89.     if( isTRUE(uppercase) || (is.na(uppercase) && (alpha==0.01))){
  90.       ## 自动:0.01 水平改为大写字母
  91.       detocopy[,1] = toupper(detocopy[,1])
  92.     }
  93.   }
  94.   
  95.   copy_to_clipboard( detocopy,col.names = FALSE)
  96.   cat("\n\n",rep("#",30),"\n",rep("#",5), " 已复制字母标记(按原数据区域顺序)到剪贴板。 ",rep("#",5),"\n",rep("#",30),"\n\n")
  97.   
  98. }


  99. fhelp()
复制代码



如有后续更新,请点击“只看作者”。

使用道具

地板
axia991031 发表于 2017-12-27 18:13:38 |只看作者 |坛友微信交流群
premandhi 发表于 2017-12-25 18:53
修正了新版本agricolae程序包(1.2-7及以上)不能适用的bug:
谢谢楼主 mark

使用道具

7
axia991031 发表于 2017-12-27 18:13:38 |只看作者 |坛友微信交流群
premandhi 发表于 2017-12-25 18:53
修正了新版本agricolae程序包(1.2-7及以上)不能适用的bug:
谢谢楼主 mark

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-19 18:50