Advertisement
yayopoint

whitney

Sep 8th, 2018
298
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 1.96 KB | None | 0 0
  1. whitney <- function(x, groups, weights = NULL)  {
  2.  
  3.   f <- ! is.na(x) & ! is.na(groups)
  4.   x <- x[f]
  5.   groups <- groups[f]
  6.   weights <- weights[f]
  7.   lv <- levels(groups)
  8.  
  9.   sort.x <- sort(x, index.return=TRUE)
  10.   ranks <- 1:length(x)
  11.   unique.x <- unique(sort.x$x)
  12.  
  13.   if (! is.null(weights)) {
  14.     require(Hmisc)
  15.     ranks <- wtd.rank(x, weights=weights)
  16.   } else {
  17.     for (i in unique.x) {
  18.       f <- sort.x$x == i
  19.       rf <- ranks[f]
  20.       ranks[f] <- rep(mean(rf), length(rf))
  21.     }
  22.     new.index <- sort(sort.x$ix, index.return=TRUE)$ix
  23.     ranks <- ranks[new.index]
  24.   }
  25.  
  26.  
  27.   g1 <- ranks[groups == lv[1]]
  28.   g2 <- ranks[groups == lv[2]]
  29.  
  30.   if (! is.null(weights)) {
  31.     wt1 <- weights[groups == lv[1]]
  32.     wt2 <- weights[groups == lv[2]]
  33.  
  34.     n1 <- sum(wt1)
  35.     n2 <- sum(wt2)
  36.     rank1 <- sum(wt1*g1)
  37.     rank2 <- sum(wt2*g2)
  38.   } else {
  39.     n1 <- length(g1)
  40.     n2 <- length(g2)
  41.     rank1 <- sum(g1)
  42.     rank2 <- sum(g2)
  43.   }
  44.  
  45.   u1 <- n1*n2 + (n1*(n1+1))/2 - rank1
  46.   u2 <- n1*n2 + (n2*(n2+1))/2 - rank2
  47.   u <- min(u1,u2)
  48.  
  49.   if (u > (n1*n2)/2) {
  50.     u <- n1*n2 - u
  51.     w <- rank1
  52.   } else {
  53.     w <- rank2
  54.   }  
  55.  
  56.   mu <- (n1*n2)/2
  57.   sigma <- sqrt((n1*n2*(n1+n2+1))/12)
  58.  
  59.   z <- (u - mu)/sigma
  60.  
  61.   if (n1 < 50 & n2 < 50) {
  62.     p <- pwilcox(u, n1, n2)*2
  63.   } else {
  64.     p <- pnorm(-abs(z))*2
  65.   }
  66.  
  67.   result <- list(u = u, w = w, z = z, "p-value" = p)
  68.   result$names <- levels(groups)
  69.   result$ranksum <- c(rank1, rank2)
  70.   result$n <- c(n1, n2)
  71.  
  72.   class(result) <- "whitney"
  73.  
  74.   return(result)
  75. }
  76.  
  77. print.whitney <- function(x) {
  78.   tab <- data.frame("Grupos" = x$names,
  79.                     "n" = x$n,
  80.                     "Suma de rangos" = x$ranksum)
  81.   print(tab)
  82.   cat("\n")
  83.   p <- format(c(x$u, x$w, x$z))
  84.   cat(paste("U de Mann-Whitney: ", p[1], "\n"))
  85.   cat(paste("    W de Wilcoxon: ", p[2], "\n"))
  86.   cat(paste("                Z: ", p[3], "\n"))
  87.   cat("\n")
  88.   cat(paste("p-value: ", x[["p-value"]], "\n"))
  89.   invisible(x)
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement