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.

Previous
Next