Boa tarde Andre,
como o Walmes afirmou seu exemplo ainda não é reproduzível. Entretanto, segue um exemplo para servir de inspiração para o seu problema.
Uma dica é você buscar entendimento da lógica de obtenção da matriz de variância e covariância Σ nas documentações da função mahalanobis.dist()
do pacote StatMatch.
O exemplo que trago a seguir é para uma condição experimental então utilizei a matriz de variância e covariância S
(matriz de soma de quadrados e produtos residuais/graus de liberdade dos resíduos). Entretanto, você pode tentar adaptar para sua condição
definindo a matriz de variância e covariância de interesse.
# Dados para o exemplo.
dat <- structure(list(trat = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L,
3L, 3L, 4L, 4L, 4L), .Label = c("1", "2", "3", "4"), class = "factor"),
x1 = c(50.039225756996, 51.7825110686358, 48.1384396336807,
50.4489824448722, 48.4220046908771, 44.5221770682025, 52.2588301216718,
54.1412387912868, 48.8071610383588, 53.8184419408507, 53.5005661405145,
48.8892313217333), x2 = c(40.0577191986925, 36.6154386398641,
45.1013819536244, 37.9422687414707, 41.1111204733925, 33.3243892012254,
33.0139305834796, 35.7751641361826, 47.7243822772713, 39.8005702375829,
38.3100567194852, 44.0757780378149), x3 = c(10.4591588838242,
10.6373435622737, 10.3189328544074, 10.0386650378322, 9.96842284038367,
10.6003051066032, 10.8695539960311, 10.143593400873, 9.45082912208145,
9.28742328152705, 9.60271226420169, 10.1566398296013)), .Names = c("trat",
"x1", "x2", "x3"), row.names = c(NA, -12L), class = "data.frame")
attach(dat)
# Matriz contendo as variáveis que serão analizadas.
resp = as.matrix( dat[,2:ncol(dat)] )
# Realização da Manova para obtenção da matriz de covariância residual (S).
mav <- manova(resp ~ trat)
quadro = summary(mav,test="Wilks")
glr <- df.residual(mav)
S <- quadro$SS$Residuals/glr
# Obtenção das médias dos tratamentos
medtrat <- aggregate(resp, by = list(trat), FUN = mean)[,2:ncol(dat)]
medtrat <- as.matrix(medtrat)
# Obtenção da matriz D2 de Mahalanobis
nla = numeric(0)
nlb = numeric(0)
acd = (nrow(medtrat)-1):1
acc=1:(nrow(medtrat)-1)
acc1=2:nrow(medtrat)
D2 <- mat.or.vec(nrow(medtrat),nrow(medtrat))
for(i in 1:length(acd)){
nla <- c(nla, rep( acc[i],each=acd[i] ))
nlb <- c(nlb, acc1[i]:nrow(medtrat) )
}
for(i in 1:length(nla)){
D2[nla[i], nlb[i]] <- t(medtrat[nla[i],] - medtrat[nlb[i],])%*%solve(S)%*%(medtrat[nla[i],] - medtrat[nlb[i],])
D2[nlb[i], nla[i]] <- D2[nla[i], nlb[i]]
}
# Matriz D2 de Mahalanobis
D2
#################################################################
Tiago de Souza Marçal - Graduando em Agronomia pelo CCA-UFES
Bolsista de Iniciação Científica da área de Genética e Melhoramento de Plantas
#################################################################
Date: Fri, 26 Jun 2015 00:34:46 +0000
From: andreolsouza@yahoo.com.br
To: walmeszeviani@gmail.com; r-br@listas.c3sl.ufpr.br
Subject: Re: [R-br] Sistema é computacionalmente singular - Matriz/Mahalanobis
Desculpas pela falta de clareza Walmes, é que não citei que a função faz é D_{ij}^2 = (x_i - x_j)' (Σ^-1) (x_i - x_j) e a matriz Σ, neste caso não tem inversa comum. Já tentei várias funções e de fato todas funções para tal método usam a função solve(Σ) como padrão. Desisti de usar a matriz de Mahalanobis, pensei em distancia Euclidiana, mas seria importante eu conseguir usar um método que envolvesse a matriz de covariâncias para obter D2. Minha pergunta é se teria uma forma de usar, neste caso, um outro tipo de inversa (outro algorítimo) e sem comprometer a matriz D2 ou se vou mesmo ter ficar com distancia Euclidiana e variantes.
setwd("/home/andre")
dados <- read.csv("dados.txt", sep="")
str(dados)
'data.frame': 6 obs. of 10 variables:
$ ch : int 146 26 44 56 73 101
$ lam : int 126 14 20 104 54 156
$ esfr : int 208 1 1 36 73 22
$ cut : int 43 10 9 20 22 40
$ fleh : int 16 1 1 2 9 5
$ tmont : int 45 5 12 15 11 27
$ mont : int 18 8 16 25 21 32
$ montco : int 6 0 3 2 2 3
$ vocal : int 106 14 21 105 97 151
$ respaud: int 123 44 64 113 56 79
dados
ch lam esfr cut fleh tmont mont montco vocal respaud
A 146 126 208 43 16 45 18 6 106 123
B 26 14 1 10 1 5 8 0 14 44
C 44 20 1 9 1 12 16 3 21 64
D 56 104 36 20 2 15 25 2 105 113
E 73 54 73 22 9 11 21 2 97 56
F 101 156 22 40 5 27 32 3 151 79
require(StatMatch)
D2=mahalanobis.dist(dados)
mahalanobis.dist(dados)
Error in solve.default(cov, ...) :
sistema é computacionalmente singular: condição recíproca número = 1.53112e-19
require(biotools)
Cov=cov(dados)
D2=D2.dist(dados, Cov)
D2=D2.dist(dados, Cov)
Error in solve.default(cov, (x[i, ] - x[j, ])) :
sistema é computacionalmente singular: condição recíproca número = 1.53112e-19
André Oliveira Souza.
Graduação em Matemática, mestrado em estatística aplicada.Instituto Federal de Educação, Ciência e Tecnologia do Espirito Santo. IFES
Em Quinta-feira, 25 de Junho de 2015 19:41, walmes . <walmeszeviani@gmail.com> escreveu:
Seu exemplo é 100% não reproduzível.
À disposição.
Walmes.
_______________________________________________
R-br mailing list
R-br@listas.c3sl.ufpr.br
https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forne�a c�digo m�nimo reproduz�vel.