[R] Stats help with calculating between and within subject variance and confidence intervals
Paul
paul at paulhurley.co.uk
Wed Sep 9 22:37:49 CEST 2009
Hello.
I'm trying to find a way in R to calculate between and within subject
variances and confidence intervals for some analytical method
development data.
I've found a reference to a method in Burdick, R. K. & Graybill, F. A.
1992, Confidence Intervals on variance components, CRC Press. This
example is for Balanced Data confidence interval calculation from Pg
62. The data are fill weights from bottles sampled randomly from a
sample of four filling machines. There are 12 values, and the
confidence intervals are for 1-2a = 95%. I have got the same results
as the book but using slightly different fomulae (see variables for H1,
G1 and H12 and G12).
I'd appreciate any help, and any comments on whether their is a better
way to do this.
Thanks
Paul.
> BGBottles
Machine weight
1 1 14.23
2 1 14.96
3 1 14.85
4 2 16.46
5 2 16.74
6 2 15.94
7 3 14.98
8 3 14.88
9 3 14.87
10 4 15.94
11 4 16.07
12 4 14.91
> BGaov<-aov(weight~Machine,data=BGBottles)
> summary(BGaov)
Df Sum Sq Mean Sq F value Pr(>F)
Machine 3 5.3294 1.7765 9.7702 0.004733 **
Residuals 8 1.4546 0.1818
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
> BGaov
Call:
aov(formula = weight ~ Machine, data = BGBottles)
Terms:
Machine Residuals
Sum of Squares 5.329425 1.454600
Deg. of Freedom 3 8
Residual standard error: 0.4264094
Estimated effects may be unbalanced
> BGaov<-aov(weight~Machine+Error(Machine),data=BGBottles)
> summary(BGaov)
Error: Machine
Df Sum Sq Mean Sq
Machine 3 5.3294 1.7765
Error: Within
Df Sum Sq Mean Sq F value Pr(>F)
Residuals 8 1.45460 0.18182
> BGaov
Call:
aov(formula = weight ~ Machine + Error(Machine), data = BGBottles)
Grand Mean: 15.4025
Stratum 1: Machine
Terms:
Machine
Sum of Squares 5.329425
Deg. of Freedom 3
Estimated effects may be unbalanced
Stratum 2: Within
Terms:
Residuals
Sum of Squares 1.4546
Deg. of Freedom 8
Residual standard error: 0.4264094
> confint<-95
> a<-(1-(confint/100))/2
> #str(BGaov) # get structure of BGAOV object
> #str(summary(BGaov)) # get structure of BGaov summary
> #summary(aov.1.e)[[2]][[1]]$"Df" # Could also use this syntax
> grandmean<-as.vector(BGaov$"(Intercept)"[[1]][1]) # Grand Mean (I think)
> within<-summary(BGaov)$"Error: Within"[[1]]$"Mean Sq" # S2^2Mean
Square Value for Within Machine = 0.1819
> dfMachine<-summary(BGaov)$"Error: Machine"[[1]]$"Df" # DF for within = 3
> dfWithin<-summary(BGaov)$"Error: Within"[[1]]$"Df" # DF for within = 8
> machine<-summary(BGaov)$"Error: Machine"[[1]]$"Mean Sq" # S1^2Mean
Square for Machine
> between<-(machine-within)/((dfWithin/(dfMachine+1))+1) # (S1^2-S2^2)/J
> total<-between+within
> between # Between Run Variance
[1] 0.53155
> within # Within Run Variance
[1] 0.181825
> total # Total Variance
[1] 0.713375
> betweenCV<-sqrt(between)/grandmean * 100 # Between Machine CV%
> withinCV<-sqrt(within)/grandmean * 100 # Within Machine CV%
> totalCV<-sqrt(total)/grandmean * 100 # Total CV%
> #within confidence intervals (Chi Squared Method)
> withinLCB<-within/qf(1-a,8,Inf) # Within LCB
> withinUCB<-within/qf(a,8,Inf) # Within UCB
> #Between Confidence Intervals (Modified Large Sample Method)
> n1<-dfMachine
> n2<-dfWithin
> G1<-1-(1/qf(1-a,n1,Inf)) # According to Burdick and Graybill this
should be a
> G2<-1-(1/qf(1-a,n2,Inf))
> H1<-(1/qf(a,n1,Inf))-1 # and this should be 1-a, but my results
don't agree
> H2<-(1/qf(a,n2,Inf))-1
>
G12<-((qf(1-a,n1,n2)-1)^2-(G1^2*qf(1-a,n1,n2)^2)-(H2^2))/qf(1-a,n1,n2) #
again, should be a, not 1-a
> H12<-((1-qf(a,n1,n2))^2-H1^2*qf(a,n1,n2)^2-G2^2)/qf(a,n1,n2) # again,
should be 1-a, not a
> Vu<-H1^2*machine^2+G2^2*within^2+H12*machine*within
> Vl<-G1^2*machine^2+H2^2*within^2+G12*within*machine
> betweenLCB<-(machine-within-sqrt(Vl))/J # Betwen LCB
> betweenUCB<-(machine-within+sqrt(Vu))/J # Between UCB
> #Total Confidence Intervals (Graybill-Wang Method)
> y<-(machine+(J-1)*within)/J
> totalLCB<-y-(sqrt(G1^2*machine^2+G2^2*(J-1)^2*within^2)/J) # Total LCB
> totalUCB<-y+(sqrt(H1^2*machine^2+H2^2*(J-1)^2*within^2)/J) # Total UCB
> result<-data.frame(Name=c("within", "between",
"total"),CV=c(withinCV,betweenCV,totalCV),LCB=c(sqrt(withinLCB)/grandmean*100,sqrt(betweenLCB)/grandmean*100,sqrt(totalLCB)/grandmean*100),UCB=c(sqrt(withinUCB)/grandmean*100,sqrt(betweenUCB)/grandmean*100,sqrt(totalUCB)/grandmean*100))
> result
Name CV LCB UCB
1 within 2.768443 1.869964 5.303702
2 between 4.733483 2.123816 18.551051
3 total 5.483625 3.590745 18.772389
More information about the R-help
mailing list