I have a design matrix that is not full-rank and I want to convert it to full-rank. I decided to make a contrast matrix. I have subtracted the first row from succeeding rows. However, it does not sum to zero. What should I do next to make it sum to zero so that I can use it to reparameterize my design matrix, which then should becomee full-rank?
Here is my procedure:
install.packages("UsingR")
require(UsingR)
#--1. source
df <- grip %>% dplyr::select(UBP, person, grip.type)
df <- arrange(df, person, grip.type)
lapply(df, head)
df %>% group_by(person, grip.type, .add=TRUE) %>% group_nest()
#--2. model
X <- cbind(1, as.matrix( ( model.matrix( UBP ~ person + grip.type + 0, data=df) ) ))
Y <- df$UBP
n <- nrow(X); k <- qr(X)$rank
The problem is with lambda
after subtracting first row from succeeding rows:
#--3. estimating parameters
lambda <- unique(X)
lambda[-1,] <- lambda[-1,] - lambda[1,][col( data.matrix( lambda[-1,]) )]
B_ <- ginv(t(X) %*% X) %*% (t(X) %*% Y); colnames(B_) <- "Estimates"
Z.prime_ <- X %*% ( t(lambda) %*% solve( (lambda %*% t(lambda)) ) ) #--prime model
gamma.prime_ <- lambda %*% B_
Y.prime_ <- Z.prime_ %*% gamma.prime_
lambda
before subtracting:
> lambda
person1 person2 person3 person4 grip.typeintegrated grip.typemodern
1 1 1 0 0 0 0 0
25 1 1 0 0 0 1 0
13 1 1 0 0 0 0 1
4 1 0 1 0 0 0 0
28 1 0 1 0 0 1 0
16 1 0 1 0 0 0 1
7 1 0 0 1 0 0 0
31 1 0 0 1 0 1 0
19 1 0 0 1 0 0 1
10 1 0 0 0 1 0 0
34 1 0 0 0 1 1 0
22 1 0 0 0 1 0 1
lambda
after subtracting:
> lambda[-1,] <- lambda[-1,] - lambda[1,][col( data.matrix( lambda[-1,]) )]
> lambda
person1 person2 person3 person4 grip.typeintegrated grip.typemodern
1 1 1 0 0 0 0 0
25 0 0 0 0 0 1 0
13 0 0 0 0 0 0 1
4 0 -1 1 0 0 0 0
28 0 -1 1 0 0 1 0
16 0 -1 1 0 0 0 1
7 0 -1 0 1 0 0 0
31 0 -1 0 1 0 1 0
19 0 -1 0 1 0 0 1
10 0 -1 0 0 1 0 0
34 0 -1 0 0 1 1 0
22 0 -1 0 0 1 0 1
> sum(lambda)
[1] 10