Why is there aliasing in a full-factorial design? I am using the R package AlgDesign to evaluate the design of a simple full-factorial experiment, tweaking an example from R Bloggers. I've specified nTrials = nrow(cand.list) to ensure that the optimal design is chosen to be a full factorial rather than a partial factorial:
cand.list = expand.grid(Factor1 = c("A", "B", "C", "D"),
                        Factor2 = c("I", "II", "III"),
                        Factor3 = c("Low", "High"),
                        Factor4 = c("Yes", "No"))

res = optFederov( ~ .,
                  data = cand.list,
                  nTrials = nrow(cand.list))

eval.design(~ .,
            design = res$design,
            confounding = TRUE)

What I do not understand is that the confounding matrix seems to indicate that the main effects are aliased with other main effects, also evidenced by the diagonality of only 0.77. Why is this? Shouldn't a full-factorial experiment be entirely free of aliasing?
 A: That's only true of 2-level factorials.  
Consider the following example. 
cand.list = expand.grid(Factor2 = c("I", "II", "III"))
X <- model.matrix(~., data=cand.list)

print(X)

#   (Intercept) Factor2II Factor2III
# 1           1         0          0
# 2           1         1          0
# 3           1         0          1
# attr(,"assign")
# [1] 0 1 1
# attr(,"contrasts")
# attr(,"contrasts")$Factor2
# [1] "contr.treatment"

Above, note that R drops one level from each factor because otherwise the columns relating to the levels of any factor and the intercept will be linearly dependent and so a unique least squares solution would no longer exist.
Now, we can find the alias matrix for a set of effects coded with $\mathbf{X}_2$ on the model coded with $\mathbf{X}_1$ by looking at the projection of the columns of $\mathbf{X}_2$ on the column space of $\mathbf{X}_1$:
$$
\mathbf{A} = \bigl(\mathbf{X}_1^\mathrm{T} \mathbf{X}_1\bigr)^{-1} \mathbf{X}_1^\mathrm{T} \mathbf{X}_2~.
$$
If we do this by removing Factor2II we get 
solve(t(X[,-2]) %*% X[,-2]) %*% t(X[,-2]) %*% X[,2]

#            [,1]
# (Intercept)  0.5
# Factor2III  -0.5

which shows that the column for Factor2II is not orthogonal from Factor2III. 
However, you'll note that the confounding matrix from AlgDesign is block diagonal!  Levels between different factors are orthogonal.
