> rm(list=ls()) > # set.seed(101) > rnorm2 <- function(n,mean,sd){ mean+sd*scale(rnorm(n)) } > ss <- function(x) { + sum((x-mean(x))^2) + } > > n.o <- 30 > n.p <- 30 > o <- rnorm(n.o, 100, 10) > p <- rnorm(n.p, 105, 10) > t.test(o,p, var.equal=T) Two Sample t-test data: o and p t = -3.3581, df = 58, p-value = 0.001391 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: -14.78163 -3.74076 sample estimates: mean of x mean of y 97.31987 106.58106 > comb <- list(o = o, p = p) > op <- stack(comb) > head(op) values ind 1 83.05641 o 2 108.25078 o 3 90.81559 o 4 99.74236 o 5 82.61865 o 6 85.64129 o > colnames(op)[1] <- "values" > colnames(op)[2] <- "group" > op$group <- factor(op$group) > head(op) values group 1 83.05641 o 2 108.25078 o 3 90.81559 o 4 99.74236 o 5 82.61865 o 6 85.64129 o > boxplot(op$values~op$group) > > {{:pasted:20250925-082846.png}} > plot(op$values~op$group) > boxplot(op$values~op$group, main="values by group", + yaxt="n", xlab="value", horizontal=TRUE, + col=terrain.colors(2)) > abline(v=mean(op$values), col="red", lwd=3) > legend("topleft", inset=.05, title="group", + c("o","p"), fill=terrain.colors(2), horiz=TRUE) > > m.tot <- mean(op$values) > m.o <- mean(o) > m.p <- mean(p) > > min.x <- min(op$values) > max.x <- max(op$values) > br <- seq(floor(min.x), ceiling(max.x), by = 1) > {{:pasted:20250925-083030.png}} > hist(o, breaks=br, + col=rgb(1,1,1,.5)) > abline(v=m.o, col="red", lwd=3) > hist(p, add=T, breaks=br, + col=rgb(.5,1,1,.5)) > abline(v=m.p, col="blue", lwd=3) > abline(v=m.tot, col='black', lwd=3) > > ss.tot <- ss(op$values) > df.tot <- length(op$values)-1 > ss.tot/df.tot [1] 133.9582 > var(op$values) [1] 133.9582 > ss.tot [1] 7903.533 > > ss.o <- ss(o) > ss.p <- ss(p) > df.o <- length(o)-1 > df.p <- length(p)-1 > > m.tot [1] 101.9505 > m.o [1] 97.31987 > m.p [1] 106.5811 > ss.o [1] 3647.085 > ss.p [1] 2969.903 > > ss.bet <- length(o)*(m.tot-m.o)^2+length(p)*(m.tot-m.p)^2 > ss.tot [1] 7903.533 > ss.bet [1] 1286.546 > ss.wit <- ss.o+ss.p > ss.wit [1] 6616.987 > ss.bet+ss.wit [1] 7903.533 > ss.tot [1] 7903.533 > > df.tot <- length(op$values)-1 > df.bet <- nlevels(op$group) - 1 > df.wit <- (length(o)-1)+(length(p)-1) > df.tot [1] 59 > df.bet [1] 1 > df.wit [1] 58 > > ms.tot <- ss.tot / df.tot > ms.bet <- ss.bet / df.bet > ms.wit <- ss.wit / df.wit > > f.cal <- ms.bet / ms.wit > f.cal [1] 11.27699 > p.val <- pf(f.cal, df1=df.bet, df2=df.wit, lower.tail = F) > p.val [1] 0.001390984 > summary(aov(op$values~op$group)) Df Sum Sq Mean Sq F value Pr(>F) op$group 1 1287 1286.5 11.28 0.00139 ** Residuals 58 6617 114.1 --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 > t.test(o,p, var.equal = T) Two Sample t-test data: o and p t = -3.3581, df = 58, p-value = 0.001391 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: -14.78163 -3.74076 sample estimates: mean of x mean of y 97.31987 106.58106 > > diff <- m.o - m.p > ssp <- (ss.o + ss.p) / (df.o + df.p) > se <- sqrt(ssp/n.o+ssp/n.p) > t.cal <- diff/se > t.cal [1] -3.358122 > p.t.cal <- pt(abs(t.cal), df=df.o+df.p, lower.tail = F)*2 > p.t.cal [1] 0.001390984 > t.cal^2 [1] 11.27699 > f.cal [1] 11.27699 > > df.bet [1] 1 > df.wit [1] 58 > f.cal [1] 11.27699 > >