# 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?