- myfunc <- function(..., digits = 2){
- list <- list(...)
- if (is.call(list[[1]])) {
- mydata <- eval(list[[2]])
- if (!(is.matrix(mydata) || is.data.frame(mydata)))
- stop("第二个参数须为矩阵或者数据框")
- listformula <- as.list(list[[1]])
- x <- mydata[[deparse(listformula[[2]])]]
- grp <- mydata[[deparse(listformula[[3]])]]
- } else {
- x <- c(list[[1]], list[[2]])
- grp <- rep(c(1, 2), c(length(list[[1]]), length(list[[2]])))
- mydata <- data.frame(x, grp)
- }
- options(digits = digits)
-
- satt <- t.test(..., var.equal = F)
- ttest <- t.test(..., var.equal = T)
- vartest <- var.test(list[[1]], list[[2]])
-
- summ <- by(x, grp, pastecs::stat.desc)
- lisnames <- names(summ)
- table1names <- c("g", "方法", "数目", "均值", "标准差", "标准误差",
- "最小值", "最大值")
- table2names <- c("g", "方法", "均值", "%95-down", "%95-up", "标准差")
-
- vector1 <- summ[[1]][c(9, 13, 10, 4, 5)]
- vector2 <- summ[[2]][c(9, 13, 10, 4, 5)]
-
- vec1 <- c(summ[[1]][9], summ[[1]][9] - summ[[1]][11],
- summ[[1]][9] + summ[[1]][11], summ[[1]][13])
- vec2 <- c(summ[[2]][9], summ[[2]][9] - summ[[2]][11],
- summ[[2]][9] + summ[[2]][11], summ[[2]][13])
-
- diffmean <- summ[[1]][9] - summ[[2]][9]
-
- diffsum1 <- c(diffmean, NA, ttest$stderr, NA, NA)
- diffsat1 <- c(diffmean, NA, satt$stderr, NA, NA)
-
- diffsum2 <- c(diffmean, ttest$conf.int[1:2], NA)
- diffsat2 <- c(diffmean, satt$conf.int[1:2], NA)
-
- words <- c("差", "(", lisnames[1], "-", lisnames[2], ")")
- g <- c(lisnames, paste(words, collapse = ""), paste(words, collapse = ""))
- method <- c(NA, NA, "汇总", "Satterthwaite")
- num <- c(length(grp[as.character(grp) == lisnames[1]]),
- length(grp[as.character(grp) == lisnames[2]]), NA, NA)
-
- matrix1 <- rbind(vector1, vector2, diffsum1, diffsat1)
- table1 <- data.frame(g, method, num, matrix1)
- colnames(table1) <- table1names
- rownames(table1) <- NULL
-
- matrix2 <- rbind(vec1, vec2, diffsum2, diffsat2)
- table2 <- data.frame(g, method, matrix2)
- colnames(table2) <- table2names
- rownames(table2) <- NULL
-
- 方法 <- c("汇总", "Satterthwaite")
- 方差 <- c("等于", "不等于")
- 自由度 <- c(ttest[["parameter"]],satt[["parameter"]])
- t值 <- c(ttest[["statistic"]],satt[["statistic"]])
- `Pr > |t|` <- c(ttest[["p.value"]],satt[["p.value"]])
- table3 <- data.frame(方法, 方差, 自由度, t值, `Pr > |t|`)
- rownames(table3) <- NULL
-
- table4 <- data.frame(方法 = "折叠的F",
- 分子自由度 = vartest$parameter[1],
- 分母自由度 = vartest$parameter[2],
- F值 = vartest$statistic,
- `Pr > F` = vartest$p.value)
- rownames(table4) <- NULL
-
- print.ttest <- function(table){
- print(table)
- cat("\n")
- }
-
- table <- list(table1, table2, table3, table4)
- for (i in 1:length(table)) print.ttest(table[[i]])
- }
- #example
- x <- c(12 : 17, 19)
- grp <- rep(2 : 3, c(3, 4))
- testdata <- data.frame(x, grp)
- myfunc(x~grp, testdata)
- # or
- myfunc(x[1:3], x[4:7])
- # digits参数可以控制小数位
- myfunc(x[1:3], x[4:7], digits = 1)
- # alternative可以设置检验方向:c("two.sided", "less", "greater")
- myfunc(x[1:3], x[4:7], alternative = "less")
需要安装pastecs包, 两个软件计算方差齐性时的F值略有不同,R是小方差除以大方差,sas是大方差除以小方差,相当于一个是左侧F值,一个右侧F值。有几个描述指标没有找到现成的函数,楼主可以在我的函数里添加这些指标的计算。我就不写了。


雷达卡




京公网安备 11010802022788号







