########## for a=3 and b=8############

#clear all; format compact; format long;

iter=5000
a = 3
b = 8
N = a*b
dfE = (a-1)*(b-1)

blockvec <-c(rep(1,a),rep(2,a),rep(3,a),rep(4,a),
             rep(5,a),rep(6,a),rep(7,a),rep(8,a))
trtvec <-c(rep(1:a,b)) 
mu = 0
tau = matrix(0,nrow=1,ncol=a)
beta= matrix(0,nrow=1,ncol=b)


EY<-matrix(0,nrow=8,ncol=3)

for (j in 1:b){
  for (i in 1:a){
    EY[j,i] = mu + tau[i] + beta[j]
  }
}

#EY

Reject     = matrix(0,nrow=1,ncol=3)
RejectMLE  = matrix(0,nrow=1,ncol=3)
RejectExact= matrix(0,nrow=1,ncol=3)

for (samp in 1:iter){
  block = blockvec
  trt   = trtvec
  #Generate data set
  #Ymat = EY + matrix( rnorm(b*a,mean=0,sd=1), b, a)
  Ymat = EY + randn(b,a)
  Y = matrix(t(Ymat),nrow = 1,ncol=N, byrow = TRUE)
  
  # Calculate summary stats needed for MLE computation
  yidot<-matrix(0,nrow=a,ncol=1)
  for (i in 1:a){
    yidot[i,1] = sum(Ymat[,i])
  }  
  yjdot<-matrix(0,nrow=b,ncol=1)
  for (j in 1:b){
    yjdot[j,1] = sum(Ymat[j,]) 
  } 
  ydotdot = sum(yjdot)
  
  # Run ANOVA for complete data set and save p-value
  #p = anovan(Y,{block,trt},'varnames',{'block','trt'},'display','off')
Y=t(Y)
  p = aov(Y~as.factor(trt)+as.factor(block))
  p=c(summary(p)[[1]][[1,"Pr(>F)"]],summary(p)[[1]][[2,"Pr(>F)"]])
  pvalue=p[1]
  
  # Delete an observation 
  row = ceil(b*rand(1))
  col = ceil(a*rand(1))
  remove = Ymat[row,col]
  Ymat[row,col] = NaN
  Y = matrix(t(Ymat),nrow = 1,ncol=N, byrow = TRUE)
  
  vecID = a*(row-1) + col # location of NaN in block and trt vectors
  block[vecID] = NaN
  trt[vecID] = NaN
  
  # Run exact ANOVA and save p-value
  Y=t(Y)
  p = aov(Y~as.factor(block)+as.factor(trt))
  p=c(summary(p)[[1]][[1,"Pr(>F)"]],summary(p)[[1]][[2,"Pr(>F)"]])
  pvalueExact=p[2]

  
  # Adjust summary stats for missing value and calculate MLE
  ydotdotP = ydotdot    - remove
  yidotP   = yidot[col] - remove
  yjdotP   = yjdot[row] - remove
  
  MLE = (a*yidotP + b*yjdotP - ydotdotP)/dfE
  Y[vecID] = MLE
  block[vecID] = row
  trt[vecID] = col
  
  # Run ANOVA with MLE
  p = aov(Y~as.factor(trt)+as.factor(block))
  #SS=c(summary(p)[[1]][[1,"Sum Sq"]],summary(p)[[1]][[2,"Sum Sq"]],summary(p)[[1]][[3,"Sum Sq"]])
  MStrt = summary(p)[[1]][[1,"Mean Sq"]]
  SSE   = summary(p)[[1]][[3,"Sum Sq"]]
  MSE   = SSE/(dfE-1)
  Ftrt = MStrt/MSE
  pvalueMLE = pf(Ftrt,(a-1),(dfE-1),lower.tail=FALSE)
  
  if( pvalue <= .10) Reject[1,1] = Reject[1,1]+1
  if (pvalue <= .05) Reject[1,2] = Reject[1,2]+1
  if (pvalue <= .01) Reject[1,3] = Reject[1,3]+1
  
  if (pvalueMLE <= .10) RejectMLE[1,1] = RejectMLE[1,1]+1
  if (pvalueMLE <= .05) RejectMLE[1,2] = RejectMLE[1,2]+1
  if (pvalueMLE <= .01) RejectMLE[1,3] = RejectMLE[1,3]+1
  
  if (pvalueExact <= .10) RejectExact[1,1] = RejectExact[1,1]+1
  if (pvalueExact <= .05) RejectExact[1,2] = RejectExact[1,2]+1
  if (pvalueExact <= .01) RejectExact[1,3] = RejectExact[1,3]+1
  
}

Power8 = Reject/iter
PowerMLE8 = RejectMLE/iter
PowerExact8 = RejectExact/iter