Computação de matriz de projeção / chapéu via fatoração QR, SVD (e fatoração de Cholesky?)

Estou tentando calcular em R uma matriz de projeçãoP de uma matriz N x J arbitráriaS:

P = S (S'S) ^ -1 S'

Eu tenho tentado fazer isso com a seguinte função:

P <- function(S){
  output <- S %*% solve(t(S) %*% S) %*% t(S)
  return(output)
}

Mas quando eu uso isso, recebo erros parecidos com o seguinte:

# Error in solve.default(t(S) %*% S, t(S), tol = 1e-07) : 
#  system is computationally singular: reciprocal condition number = 2.26005e-28

Acho que isso é resultado de um fluxo insuficiente numérico e / ou instabilidade, conforme discutido em vários lugares como r-help eaqu, mas não tenho experiência suficiente usando decomposição SVD ou QR para corrigir o problema, ou coloque esse código existente em ação. Eu também tentei o código sugerido, que é escrever solucionar como um sistema:

output <- S %*% solve (t(S) %*% S, t(S), tol=1e-7)

Mas ainda não funciona. Todas as sugestões serão apreciadas.

Tenho certeza de que minha matriz deve ser invertível e não possui co-linearidades, mesmo porque tentei testá-lo com uma matriz de variáveis fictícias ortogonais e ainda não funcion

Além disso, eu gostaria de aplicar isso a matrizes bastante grandes, então estou procurando uma solução geral elegant

questionAnswers(2)

yourAnswerToTheQuestion