How to apply the Mann-Whitney U Test in R
By: George Pipis
Tags: Hypothesis Testing, Mann Whitney, Statistics, Rstats

How to apply the Mann-Whitney U Test in R

An Example of a Non-Parametric Test in R

Image by Unsplash

In statistics, the Mann-Whitney U test (also called Wilcoxon rank-sum test) is a nonparametric test of the null hypothesis that it is equally likely that a randomly selected value from one population will be less than or greater than a randomly selected value from a second population. This test can be used to investigate whether two independent samples were selected from populations having the same distribution.

Some investigators interpret this test as comparing the medians between the two populations. Recall that the parametric test compares the means:

between independent groups.

In contrast, the null and two-sided research hypotheses for the nonparametric test are stated as follows:

This test is often performed as a two-sided test and, thus, the research hypothesis indicates that the populations are not equal as opposed to specifying directionality. A one-sided research hypothesis is used if interest lies in detecting a positive or negative shift in one population as compared to the other. The procedure for the test involves pooling the observations from the two samples into one combined sample, keeping track of which sample each observation comes from, and then ranking lowest to highest from 1 to (n1+n2, respectively.

Mann-Whitney U Test in Breast Cancer Dataset

We will work with the Breast Cancer Wisconsin dataset, where we will apply the Mann-Whitney Test in every independent variable by comparing those who were diagnosed with a malignant tumor vs those with a benign.

We provide a report where we will represent the Mean, the Standard Deviation, the Median, the Difference In Medians as well as the P-value of the Mann-Whitney U test of each variable.

library(tidyverse) # the column names of the dataset

names <- c('id_number', 'diagnosis', 'radius_mean',

'texture_mean', 'perimeter_mean', 'area_mean',

'smoothness_mean', 'compactness_mean',

'concavity_mean','concave_points_mean',

'symmetry_mean', 'fractal_dimension_mean',

'radius_se', 'texture_se', 'perimeter_se',

'area_se', 'smoothness_se', 'compactness_se',

'concavity_se', 'concave_points_se',

'symmetry_se', 'fractal_dimension_se',

'radius_worst', 'texture_worst',

'perimeter_worst', 'area_worst',

'smoothness_worst', 'compactness_worst',

'concavity_worst', 'concave_points_worst',

'symmetry_worst', 'fractal_dimension_worst')

df<-read.csv(url(" # get the data from the URL and assign the column namesdfhttps://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data "), col.names=names) # remove the ID number

df<-df%>%select(-id_number) # get the means of all the variables

means<-df%>%group_by(diagnosis)%>%summarise_all(list(mean), na.rm=TRUE )%>%gather("Variable", "Mean", -diagnosis)%>%spread(diagnosis, Mean)%>%rename("Mean_M"='M', "Mean_B"="B") # get the standard deviation of all the variables

sds<-df%>%group_by(diagnosis)%>%summarise_all(list(sd), na.rm=TRUE )%>%gather("Variable", "SD", -diagnosis)%>%spread(diagnosis, SD)%>%rename("SD_M"='M', "SD_B"="B") # get the median of all the variables

medians<-df%>%group_by(diagnosis)%>%summarise_all(list(median), na.rm=TRUE )%>%gather("Variable", "Median", -diagnosis)%>%spread(diagnosis, Median)%>%rename("Median_M"='M', "Median_B"="B") # join the tables

summary_report<-means%>%inner_join(sds, "Variable")%>%inner_join(medians, "Variable")%>%mutate(DiffInMedians=Median_M-Median_B) # now apply the Mann-Whitney U test for all variables variables<-colnames(df)[2:dim(df)[2]] pvals<-{}

vars<-{} for (i in variables) {



xxx<-df%>%select(c("diagnosis", i))







x1<-xxx%>%filter(diagnosis=="M")%>%dplyr::select(c(2))%>%na.omit()%>%pull()

x2<-xxx%>%filter(diagnosis=="B")%>%dplyr::select(c(2))%>%na.omit()%>%pull()

wc<-wilcox.test(x1,x2)





pvals<-c(pvals,round(wc$p.value,4) )

vars<-c(vars,i)



} wc_df<-data.frame(Variable=vars,pvalues=pvals) wc_df$Variable<-as.character(wc_df$Variable)

summary_report<-summary_report%>%inner_join(wc_df, by="Variable")

If we run the R script above, we get the following output. As we can see almost all of the variables appear to be statistically significant ( p-values<0.05) between the two groups (Malignant and Benign). The only non-statistically significant variables appear to be the fractal_dimension_mean , the smoothness_se and the texture_se . (You can see the output at Predictive Hacks)

Discussion

Generally, is a good idea to apply the Mann-Whitney U test during the Exploratory Data Analysis part since we can get an idea of which variables may be significant for the final machine learning model and the most important thing is that since it is a non-parametric test, we do not need to make any assumption about the distribution of the variables. For example, instead of the Student’s t-test we can apply the Mann-Whitney U test without worrying about the assumptions of the normal distribution.