1-way ANOVA by hand

# R from zero to hero
# Marco Plebani 18 May 2018

Let’s perform an ANOVA “by hand” (with a little help from R)

First, enter the data. You could enter them in Excel, save them as a tab-delimited file and then open them in R using read.delim("FILE_DIRECTORY_HERE/threegroups.txt").
In this case it’s a handful of data so I’m doing it by hand as follows:

# group 1
g1 <- c(6, 7,7.2,8,9)
#Group 2:
g2 <- c(1.5,2.5,2.6,5,5.5)
#Group 3:
g3 <- c(1, 1.2, 2.3, 4, 5)

all.measures.of.x <- c(g1,g2,g3)

# test F is MS_between / MS_within
# where:
# MS_between = SST/(k-1)
# MS_within = SSE/(N-k)

# Let's calculate all the pieces we need.
# N-k = 12
# k-1 = 2

# calculate overall mean and the group means:
grand.mean <- sum(g1,g2,g3)/15
mean.g1 <- mean(g1)
mean.g2 <- mean(g2)
mean.g3 <- mean(g3)

# To calculate SSE:
sse <- sum((g1 - mean.g1)^2) +
sum((g2-mean.g2)^2) +
sum((g3-mean.g3)^2)

# to calculate SST:

sst0 <- length(g1)*(mean.g1 - grand.mean)^2 +
length(g2)*(mean.g2 - grand.mean)^2 +
length(g3)*(mean.g3 - grand.mean)^2


# one can also obtain SST indirectly by remembering that SStotal = SST + SSE,
# so SST = SStotal - SSE
ss_total <- sum((all.measures.of.x - grand.mean)^2)
sst <- ss_total - sse
sst0 == sst
total.variance <- (sse/(15-3)) + (sst/(3-1))

Fvalue <- (sst/(3-1)) / (sse/(15-3))
# we get an F value of about 13.32
# Is it statistically higher than 1?
# let's check the value of F for df=3,12 and p=0.05
# (namely the 95th quantile of the F distribution)

# we can either look it up un a table, or ask R!
qf(p=0.95, df1=2, df2=12) # qf() is a function that gives you the Quantiles for the F distribution - basically it's a F-value calculator. Like a table of F values, just fancier.

So, is at least one of the groups siglificantly different from the others?