楼主: dxystata
1652 8

[问答] 如何用R实现SAS t检验输出结果 [推广有奖]

版主

已卖:302份资源

大师

37%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

威望
2
论坛币
183395 个
通用积分
15333.1475
学术水平
208 点
热心指数
271 点
信用等级
174 点
经验
298627 点
帖子
5586
精华
1
在线时间
13632 小时
注册时间
2006-6-21
最后登录
2025-12-22

初级学术勋章 初级热心勋章 中级热心勋章 初级信用勋章

楼主
dxystata 发表于 2021-1-16 23:36:46 |AI写论文
200论坛币


  1. data aaa;

  2. input x g;

  3. cards;

  4. 12  1

  5. 13  1

  6. 14  1

  7. 15  2

  8. 16  2

  9. 17  2

  10. 19  2

  11. ;

  12. run;
复制代码


t检验.png

如何用R写个写个函数实现如SAS输出的结果,谢谢!

最佳答案

乐天天12300 查看完整内容

需要安装pastecs包, 两个软件计算方差齐性时的F值略有不同,R是小方差除以大方差,sas是大方差除以小方差,相当于一个是左侧F值,一个右侧F值。有几个描述指标没有找到现成的函数,楼主可以在我的函数里添加这些指标的计算。我就不写了。[/backcolor]
关键词:输出结果 t检验 R实现 如何用 cards

沙发
乐天天12300 发表于 2021-1-16 23:36:47
  1. myfunc <- function(..., digits = 2){
  2.   list <- list(...)
  3.   if (is.call(list[[1]])) {
  4.     mydata <- eval(list[[2]])
  5.     if (!(is.matrix(mydata) || is.data.frame(mydata)))
  6.       stop("第二个参数须为矩阵或者数据框")
  7.     listformula <- as.list(list[[1]])
  8.     x <- mydata[[deparse(listformula[[2]])]]
  9.     grp <- mydata[[deparse(listformula[[3]])]]
  10.   } else {
  11.     x <- c(list[[1]], list[[2]])
  12.     grp <- rep(c(1, 2), c(length(list[[1]]), length(list[[2]])))
  13.     mydata <- data.frame(x, grp)
  14.   }
  15.   options(digits = digits)
  16.   
  17.   satt <- t.test(..., var.equal = F)
  18.   ttest <- t.test(..., var.equal = T)
  19.   vartest <- var.test(list[[1]], list[[2]])
  20.   
  21.   summ <- by(x, grp, pastecs::stat.desc)
  22.   lisnames <- names(summ)
  23.   table1names <- c("g", "方法", "数目", "均值", "标准差", "标准误差",
  24.                   "最小值", "最大值")
  25.   table2names <- c("g", "方法", "均值", "%95-down", "%95-up", "标准差")
  26.   
  27.   vector1 <- summ[[1]][c(9, 13, 10, 4, 5)]
  28.   vector2 <- summ[[2]][c(9, 13, 10, 4, 5)]
  29.   
  30.   vec1 <- c(summ[[1]][9], summ[[1]][9] - summ[[1]][11],
  31.             summ[[1]][9] + summ[[1]][11], summ[[1]][13])
  32.   vec2 <- c(summ[[2]][9], summ[[2]][9] - summ[[2]][11],
  33.             summ[[2]][9] + summ[[2]][11], summ[[2]][13])
  34.   
  35.   diffmean <- summ[[1]][9] - summ[[2]][9]
  36.   
  37.   diffsum1 <- c(diffmean, NA, ttest$stderr, NA, NA)
  38.   diffsat1 <- c(diffmean, NA, satt$stderr, NA, NA)
  39.   
  40.   diffsum2 <- c(diffmean, ttest$conf.int[1:2], NA)
  41.   diffsat2 <- c(diffmean, satt$conf.int[1:2], NA)
  42.   
  43.   words <- c("差", "(", lisnames[1], "-", lisnames[2], ")")
  44.   g <- c(lisnames, paste(words, collapse = ""), paste(words, collapse = ""))
  45.   method <- c(NA, NA, "汇总", "Satterthwaite")
  46.   num <- c(length(grp[as.character(grp) == lisnames[1]]),
  47.            length(grp[as.character(grp) == lisnames[2]]), NA, NA)
  48.   
  49.   matrix1 <- rbind(vector1, vector2, diffsum1, diffsat1)
  50.   table1 <- data.frame(g, method, num, matrix1)
  51.   colnames(table1) <- table1names
  52.   rownames(table1) <- NULL
  53.   
  54.   matrix2 <- rbind(vec1, vec2, diffsum2, diffsat2)
  55.   table2 <- data.frame(g, method, matrix2)
  56.   colnames(table2) <- table2names
  57.   rownames(table2) <- NULL
  58.   
  59.   方法 <- c("汇总", "Satterthwaite")
  60.   方差 <- c("等于", "不等于")
  61.   自由度 <- c(ttest[["parameter"]],satt[["parameter"]])
  62.   t值 <- c(ttest[["statistic"]],satt[["statistic"]])
  63.   `Pr > |t|` <- c(ttest[["p.value"]],satt[["p.value"]])
  64.   table3 <- data.frame(方法, 方差, 自由度, t值, `Pr > |t|`)
  65.   rownames(table3) <- NULL
  66.   
  67.   table4 <- data.frame(方法 = "折叠的F",
  68.                          分子自由度 = vartest$parameter[1],
  69.                          分母自由度 = vartest$parameter[2],
  70.                          F值 = vartest$statistic,
  71.                          `Pr > F` = vartest$p.value)
  72.   rownames(table4) <- NULL
  73.   
  74.   print.ttest <- function(table){
  75.       print(table)
  76.       cat("\n")
  77.   }
  78.   
  79.   table <- list(table1, table2, table3, table4)
  80.   for (i in 1:length(table)) print.ttest(table[[i]])
  81. }

  82. #example
  83. x <- c(12 : 17, 19)
  84. grp <- rep(2 : 3, c(3, 4))
  85. testdata <- data.frame(x, grp)

  86. myfunc(x~grp, testdata)
  87. # or
  88. myfunc(x[1:3], x[4:7])

  89. # digits参数可以控制小数位
  90. myfunc(x[1:3], x[4:7], digits = 1)

  91. # alternative可以设置检验方向:c("two.sided", "less", "greater")
  92. myfunc(x[1:3], x[4:7], alternative = "less")
复制代码


需要安装pastecs包, 两个软件计算方差齐性时的F值略有不同,R是小方差除以大方差,sas是大方差除以小方差,相当于一个是左侧F值,一个右侧F值。有几个描述指标没有找到现成的函数,楼主可以在我的函数里添加这些指标的计算。我就不写了。
已有 1 人评分经验 论坛币 学术水平 热心指数 收起 理由
dxystata + 100 + 20 + 2 + 2 热心帮助其他会员

总评分: 经验 + 100  论坛币 + 20  学术水平 + 2  热心指数 + 2   查看全部评分

藤椅
乐天天12300 发表于 2021-1-17 14:28:23
方差齐性检验:
  1. var.test(x~g, data=)
复制代码

若方差不齐采用satterthwaite法:
  1. t.test(x~g, data= , var.equal = F)
复制代码

然后根据把结果整合输出就行了,不是很难。
已有 1 人评分论坛币 收起 理由
cheetahfly + 10 热心帮助其他会员

总评分: 论坛币 + 10   查看全部评分

板凳
dxystata 发表于 2021-1-18 07:55:15
乐天天12300 发表于 2021-1-17 14:28
方差齐性检验:

若方差不齐采用satterthwaite法:
能否写个函数整合下,结果输出如SAS结果

报纸
dxystata 发表于 2021-1-18 12:52:59
继续     

地板
dxystata 发表于 2021-1-20 14:51:53
继续求助!

7
dxystata 发表于 2021-1-21 08:38:11
继续求助

8
dxystata 发表于 2021-2-28 16:56:39
乐天天12300 发表于 2021-1-16 23:36
需要安装pastecs包, 两个软件计算方差齐性时的F值略有不同,R是小方差除以大方差,sas是大方差除以小方 ...
function(...
函数后面... 什么意思,谢谢!

9
乐天天12300 发表于 2021-3-1 15:30:19
dxystata 发表于 2021-2-28 16:56
function(...
函数后面... 什么意思,谢谢!
是一种特殊类型的参数。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-1 11:18