Fingerprint
Fingerprint é a impressão digital das pessoas. Análise de Fingerprint e Connectoma se trata de explorar o porquê sermos únicos.
Os estudos de ressonância magnética funcional (fMRI) normalmente colapsam dados de muitos sujeitos, mas a organização funcional do cérebro varia entre cada um. Aqui estabelecemos que essa variabilidade individual é robusta e confiável, usando dados do CORR para identificar perfis de conectividade funcional e como atuam como uma “impressão digital” que pode identificar com precisão os indivíduos de um grande grupo.
A prova será de Seed to Voxel, análise ROI to ROI e Fingerprint.
Os dados desse experimento contém dados chineses de Beijing, chamado Consortium for Reliability and Reproducibility (CoRR) (http://fcon_1000.projects.nitrc.org/indi/CoRR/html/)
Para cada uma das 333 ROIs, é possível ver as subredes cerebrais.
Realizando análise de todas as regiões corticais:
#Leitura do ID dos sujeitos
nomes = scan("./data/fingerprint/CARAS.txt", what = "string")
Nsujeitos = length(nomes) # numero de individuos
A matriz tem um pouco mais que as 333 regiões. Há regiões da default mode, região cinzenta que não estão no atlas e por isso preciso retirar.
Realizando a leitura da matriz de conectividade funcional de cada indivíduo. São 61 indivíduos em duas leituras distintas com três meses de diferença:
#Leitura dos arquivos com as matrizes de correlacao
SCAN1 = array(0, c(Nsujeitos, 333, 333))
SCAN2 = array(0, c(Nsujeitos, 333, 333))
Realizando a leitura dos sujeitos:
for(sujeito in 1:Nsujeitos){
# Leitura de dados do SCAN1
# Concatena o prefixo e sufixo no ID do sujeito
STRINGNOME = paste("./data/fingerprint/S1-GordonConnCOR-", nomes[sujeito],
".txt", sep="")
a = read.table(STRINGNOME)
# Extrai somente as linhas e colunas de interesse
SCAN1[sujeito,,] = as.matrix(a[5:337, 5:337]) #pega somente as ROIS do atlas
# Leitura de dados do SCAN2
STRINGNOME = paste("./data/fingerprint/S2-GordonConnCOR-", nomes[sujeito],
".txt", sep="")
a = read.table(STRINGNOME)
# Como tenho dados que não interessam a análise,
# Extrai somente as linhas e colunas de interesse
SCAN2[sujeito,,] = as.matrix(a[5:337, 5:337]) #pega somente as ROIS do atlas
}#fecha for do sujeito
Para cada indivíduo em S1, quero comparar para identificar a similaridade entre os indivíduos. Existem diversas formas para estimar isso, todavia, na conectividade é usual calcular por correlação (nesse caso utilizaremos a correlação entre os vetores).
Sendo a função “upper.tri” retorna se as caselas fazem parte ou não da triangular superior:
# Criar matriz de similaridade entre individuos do Scan1 e Scan2:
SIMILARIDADE = matrix(0, Nsujeitos, Nsujeitos)
# Analisando as dimensões:
dim(SCAN1)
## [1] 61 333 333
dim(SCAN2)
## [1] 61 333 333
dim(SIMILARIDADE)
## [1] 61 61
Interpretando o que queremos: Queremos que tenhamos a máxima correlação na diagonal principal entre os grupos, ou seja, que eu consiga identificar os mesmos sujeitos em scan2 e scan1.
#Analise de Semelhanca entre conectomas funcionais
#entre SCAN1 e SCAN2
for(sujeito in 1:Nsujeitos){
#extrair vetor com os valores da matriz triangular superior
#superior das matrizes de correlacao do SCAN1 e SCAN2
conn1 = SCAN1[sujeito,,][which(upper.tri(SCAN1[sujeito,,])==TRUE)]
for(sujeito2 in 1:Nsujeitos){
conn2 = SCAN2[sujeito2,,][which(upper.tri(SCAN2[sujeito2,,])==TRUE)]
# metrica de similaridade
# Lembrando que 1 seria o maximo
SIMILARIDADE[sujeito, sujeito2] = cor(conn1, conn2)
}#fecha for sujeito2
}#fecha for do sujeito
Identificando as correlações:
SIMILARIDADE[1:5, 1:5]
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.4288607 0.3453124 0.3083977 0.3062117 0.3717610
## [2,] 0.3435626 0.5150018 0.3141666 0.2920438 0.3540784
## [3,] 0.2975418 0.3088168 0.3602394 0.2884861 0.3667134
## [4,] 0.2419438 0.2118502 0.1915199 0.3796243 0.2438880
## [5,] 0.3297267 0.3452875 0.3205173 0.3101070 0.5760162
A diagonal principal dessa matriz indica a correlação correspondente de acertar os mesmos sujeitos.
Agora identificando os indivíduos através da máxima correlação:
#Identificacao dos individuos pela maxima correlacao em cada linha
PREDICAO = array(0, Nsujeitos)
for(sujeito in 1:Nsujeitos){
PREDICAO[sujeito] = which(SIMILARIDADE[sujeito,] == max(SIMILARIDADE[sujeito,]))[1]
}
#Acuracia da predicao
length(which(PREDICAO-1:61 == 0))/Nsujeitos
## [1] 0.9344262
Como interpreto esse treco? Da contagem de 1:61 indivíduos, quero que a correlação no próximo scan seja compatível com 1:61 (ou seja, reconheça cada indivíduo).
Analisando a default-mode network:
###### ANALISE DA DEFAULT-MODE NETWORK
#Leitura do ID dos sujeitos
nomes=scan("./data/fingerprint/CARAS.txt",what="string")
Nsujeitos=length(nomes)
#Leitura do arquivo com o label das subredes cerebrais
SUBREDES=read.table("./data/fingerprint/IDnet5-337.txt")[,2]
table(SUBREDES)
## SUBREDES
## Auditory CinguloOperc CinguloParietal
## 24 40 5
## Default DorsalAttn FrontoParietal
## 41 32 24
## None RetrosplenialTemporal Salience
## 47 8 4
## SMhand SMmouth VentralAttn
## 38 8 23
## Visual
## 39
ROIS=which(SUBREDES=="Default")
NROIS=length(ROIS)
#Leitura da matriz de conectividade funcional de cada
#individuo
SCAN1=array(0,c(Nsujeitos,NROIS,NROIS))
SCAN2=array(0,c(Nsujeitos,NROIS,NROIS))
for(sujeito in 1:Nsujeitos){
# Leitura de dados do SCAN1
STRINGNOME=paste("./data/fingerprint/S1-GordonConnCOR-",nomes[sujeito],
".txt",sep="")
a=read.table(STRINGNOME)
SCAN1[sujeito,,]=as.matrix(a[5:337,5:337])[ROIS,ROIS] #pega somente as ROIS do atlas
# Leitura de dados do SCAN2
STRINGNOME=paste("./data/fingerprint/S2-GordonConnCOR-",nomes[sujeito],
".txt",sep="")
a=read.table(STRINGNOME)
SCAN2[sujeito,,]=as.matrix(a[5:337,5:337])[ROIS,ROIS] #pega somente as ROIS do atlas
}#fecha for do sujeito
#Analise de Fingerprint
#Matriz de similaridade entre sujeitos no SCAN2 e 1
SIMILARIDADE=matrix(0,Nsujeitos,Nsujeitos)
for(sujeito in 1:Nsujeitos){
#Extrai valores da matriz triangular superior
conn1=SCAN1[sujeito,,][which(upper.tri(SCAN1[sujeito,,])==TRUE)]
for(sujeito2 in 1:Nsujeitos){
#Extrai valores da matriz triangular superior
conn2=SCAN2[sujeito2,,][which(upper.tri(SCAN2[sujeito2,,])==TRUE)]
SIMILARIDADE[sujeito,sujeito2]=cor(conn1,conn2)
}}#fecha os for do sujeito
#Identificacao dos individuos pela maxima correlacao
PREDICAO=array(0,Nsujeitos)
for(sujeito in 1:Nsujeitos){
PREDICAO[sujeito]=which(SIMILARIDADE[sujeito,]==max(SIMILARIDADE[sujeito,]))[1]
}
#Acuracia da predicao
length(which(PREDICAO-1:61==0))/Nsujeitos
## [1] 0.9344262
Olhando as regiões, temos que em adultos, as regiões de funções mais básicas/primárias (visual, auditivo e SMhand) não possuem alta acurácia. Já as regiões superiores, que integram redes, identificam melhor os indivúduos (no caso DMN, frontoparietal, dorsolateral).
Analisando as redes superiores, é possível verificar que a identificação é bem-sucedida na verificação, indicando que o perfil de conectividade de um indivíduo é intrínseco e pode ser usado para diferenciá-lo, independentemente de como o cérebro está envolvido durante a geração de imagens.
As redes mais complexas ainda estão em evolução nas crianças, por isso a taxa de acurácia na infância é menor, em torno de 40%. As regiões significantes continuam sendo DMN, Frontoparietal e Dorsolateral, mas com menor acurácia pois seguem em constante desenvolvimento.
E de fato, pesquisas mostram que padrões característicos de conectividade distribuídos por todo o cérebro, mas a rede frontoparietal emergiu como a mais distinta. Perfis de conectividade preveem níveis de inteligência fluida: as mesmas redes que eram mais discriminadoras de indivíduos também mostram ser as mais indicativas do comportamento cognitivo. Os resultados indicam o potencial para fazer inferências sobre assuntos individuais com base na conectividade funcional fMRI.