neuroimagen:bioface_atn
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
neuroimagen:bioface_atn [2021/08/30 08:49] – [Otras ROI en ADNI DB] osotolongo | neuroimagen:bioface_atn [2022/06/14 08:22] (current) – [evaluando WMH] osotolongo | ||
---|---|---|---|
Line 86: | Line 86: | ||
< | < | ||
> library(" | > library(" | ||
- | > library(" | + | > library(" |
> library(" | > library(" | ||
> library(" | > library(" | ||
Line 173: | Line 173: | ||
**Nice!** | **Nice!** | ||
+ | ===== What we got so far ===== | ||
+ | |||
+ | A partir de la base de datos de ADNI, tomo los sujetos diagnosticados como // | ||
+ | |||
+ | < | ||
+ | library(" | ||
+ | library(" | ||
+ | library(" | ||
+ | library(" | ||
+ | pop <- adnimerge[adnimerge$VISCODE==" | ||
+ | pop$ND = as.factor(ifelse(pop$DX == " | ||
+ | xt <- pop[, c(" | ||
+ | </ | ||
+ | |||
+ | Con estos datos, entreno el clasificador, | ||
+ | |||
+ | < | ||
+ | classifier_cl <- naiveBayes(ND ~ ., data = xt) | ||
+ | </ | ||
+ | |||
+ | Ahora, tomo un proyecto y reuno los datos de segmentacion y demograficos. No es neceario todo pero la edad y la segmentacion basica si. Esto puede cambiar de proyeto en proyecto pero es mas o menos asi, (lo repito por tenerlo todo junto) | ||
+ | |||
+ | <code bash> | ||
+ | xnat_pullfs.pl -s aseg -x bioface19 -o bf_base_aseg.csv | ||
+ | xnat_pullfs.pl -s aparc -x bioface19 -o bf_base_aparc.csv | ||
+ | join -t, bf_base_aseg.csv bf_base_aparc.csv > bf_base.csv | ||
+ | awk -F"," | ||
+ | join -t, bf_base.csv bf_age.csv > bf_data.csv | ||
+ | </ | ||
+ | |||
+ | Cargo estos datos y construyo las variables identicas a la de los datos de ADNIMERGE. | ||
+ | |||
+ | < | ||
+ | setwd("/ | ||
+ | base <- read.csv(" | ||
+ | base$Hippocampus = base$Left.Hippocampus + base$Right.Hippocampus | ||
+ | base$Entorhinal = base$lh.entorhinal.GrayVol + base$rh.entorhinal.GrayVol | ||
+ | base$Ventricles <- base$Left.Inf.Lat.Vent + base$Right.Inf.Lat.Vent + base$Left.Lateral.Ventricle + base$Right.Lateral.Ventricle | ||
+ | base$MidTemp = base$lh.middletemporal.GrayVol + base$rh.middletemporal.GrayVol | ||
+ | base$ICV = base$eTIV | ||
+ | </ | ||
+ | |||
+ | Ahora puedo calcular el valor de //(N)//, | ||
+ | |||
+ | < | ||
+ | base$ND <- predict(classifier_cl, | ||
+ | </ | ||
+ | |||
+ | o la probabilidad de que exista neurodegeneración | ||
+ | |||
+ | < | ||
+ | base$post <- predict(classifier_cl, | ||
+ | </ | ||
+ | |||
+ | |||
+ | ^ Clasificación ^ Probabilidades de N+ ^ | ||
+ | | {{ : | ||
+ | |||
+ | Y esto voy a hacerlo para FACEHBI también para compararlo, | ||
+ | |||
+ | < | ||
+ | setwd("/ | ||
+ | read.csv(" | ||
+ | face$Hippocampus = face$Left.Hippocampus + face$Right.Hippocampus | ||
+ | face$Entorhinal = face$lh.entorhinal.GrayVol + face$rh.entorhinal.GrayVol | ||
+ | face$Ventricles <- face$Left.Inf.Lat.Vent + face$Right.Inf.Lat.Vent + face$Left.Lateral.Ventricle + face$Right.Lateral.Ventricle | ||
+ | face$MidTemp = face$lh.middletemporal.GrayVol + face$rh.middletemporal.GrayVol | ||
+ | face$ICV = face$eTIV | ||
+ | face$ND <- predict(classifier_cl, | ||
+ | face$post <- predict(classifier_cl, | ||
+ | </ | ||
+ | |||
+ | ^ Clasificación ^ Probabilidades de N+ ^ | ||
+ | | {{ : | ||
+ | |||
+ | ==== Métodos no lineales ==== | ||
+ | |||
+ | Vamos a intentar con métodos no lineales. Ojo, estos métodos no tienen interpretación probabilistica. Son construcciones matemáticas que funcionan. | ||
+ | |||
+ | === random Forest === | ||
+ | |||
+ | ** BIOFACE ** | ||
+ | < | ||
+ | rf_cl <- randomForest(ND ~ ., data = xt, na.action = na.omit) | ||
+ | base$ND <- predict(rf_cl, | ||
+ | base$post <- predict(rf_cl, | ||
+ | plot(base$AGE, | ||
+ | hist(base$post[, | ||
+ | </ | ||
+ | |||
+ | ^ Clasificación ^ Probabilidades de N+ ^ | ||
+ | | {{ : | ||
+ | |||
+ | **FACEHBI** | ||
+ | |||
+ | < | ||
+ | face$ND <- predict(rf_cl, | ||
+ | face$post <- predict(rf_cl, | ||
+ | plot(face$AGE, | ||
+ | hist(face$post[, | ||
+ | </ | ||
+ | |||
+ | ^ Clasificación ^ Probabilidades de N+ ^ | ||
+ | | {{ : | ||
+ | |||
+ | === support-vector machine === | ||
+ | |||
+ | **BIOFACE** | ||
+ | |||
+ | < | ||
+ | svm_cl <- svm(ND ~ ., data = xt, na.action = na.omit) | ||
+ | base$ND <- predict(svm_cl, | ||
+ | plot(base$AGE, | ||
+ | </ | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | ** FACEHBI ** | ||
+ | |||
+ | < | ||
+ | face$ND <- predict(svm_cl, | ||
+ | plot(face$AGE, | ||
+ | </ | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | ===== Introduciendo WMH en AT(N)===== | ||
+ | |||
+ | ¿Son las afecciones vasculares parte de la neurodegeneracion? | ||
+ | |||
+ | Pues si queremos hacerlo de esta manera, hay basicamente dos maneras. Utilizando las WMH de Freesurfer (T1w) o las calculadas por un soft independiente (T2w). Si tenemos un FLAIR 3D podemos hacerlo de ambas maneras pero en caso contrario. | ||
+ | |||
+ | ==== evaluando WMH ==== | ||
+ | |||
+ | Las WMH vienen ya calculadas en el procedimiento // | ||
+ | |||
+ | <code RMarkdown> | ||
+ | ucsffsx -> ucsffsx_t | ||
+ | ucsffsx_t$VISCODE <- ifelse(ucsffsx_t$VISCODE == " | ||
+ | a1 <- merge(pop, ucsffsx_t, by=c(" | ||
+ | a1t <- a1[, c(" | ||
+ | ... | ||
+ | ... | ||
+ | axt <- rbind(a1t, a2t, a3t) | ||
+ | xt <- rename(axt, " | ||
+ | </ | ||
+ | |||
+ | y esto hay que hacerlo para cada una de las tablas y despues concatenar los resutados. Ahora habria tambien que introducir las WMH en la DB del test, | ||
+ | |||
+ | < | ||
+ | base$WMH = base$WM.hypointensities | ||
+ | </ | ||
+ | |||
+ | |||
+ | ++++ que se dice un poco mas rapido de lo que se hace, tambien es cierto, | | ||
+ | |||
+ | <code Rmarkdown> | ||
+ | library(" | ||
+ | library(" | ||
+ | library(" | ||
+ | library(" | ||
+ | library(" | ||
+ | |||
+ | input_file=" | ||
+ | output_file=" | ||
+ | output_fig=" | ||
+ | pop <- adnimerge[(adnimerge$DX==" | ||
+ | pop$ND = as.factor(ifelse(pop$DX == " | ||
+ | ucsffsx -> ucsffsx_t | ||
+ | ucsffsx_t$VISCODE <- ifelse(ucsffsx_t$VISCODE == " | ||
+ | a1 <- merge(pop, ucsffsx_t, by=c(" | ||
+ | ucsffsx51 -> ucsffsx_t | ||
+ | ucsffsx_t$VISCODE <- ifelse(ucsffsx_t$VISCODE == " | ||
+ | a2 <- merge(pop, ucsffsx_t, by=c(" | ||
+ | ucsffsx6 -> ucsffsx_t | ||
+ | ucsffsx_t$VISCODE <- ifelse(ucsffsx_t$VISCODE == " | ||
+ | a3 <- merge(pop, ucsffsx_t, by=c(" | ||
+ | a1t <- a1[, c(" | ||
+ | a2t <- a2[, c(" | ||
+ | a3t <- a3[, c(" | ||
+ | axt <- rbind(a1t, a2t, a3t) | ||
+ | xt <- rename(axt, " | ||
+ | classifier_cl <- naiveBayes(ND ~ ., data = xt) | ||
+ | base <- read.csv(input_file) | ||
+ | base$Hippocampus = base$Left.Hippocampus + base$Right.Hippocampus | ||
+ | base$Entorhinal = base$lh.entorhinal.GrayVol + base$rh.entorhinal.GrayVol | ||
+ | base$Ventricles <- base$Left.Inf.Lat.Vent + base$Right.Inf.Lat.Vent + base$Left.Lateral.Ventricle + base$Right.Lateral.Ventricle | ||
+ | base$MidTemp = base$lh.middletemporal.GrayVol + base$rh.middletemporal.GrayVol | ||
+ | base$ICV = base$eTIV | ||
+ | base$WMH = base$WM.hypointensities | ||
+ | base$ND <- predict(classifier_cl, | ||
+ | base2e = base[, c(" | ||
+ | write.csv(base2e, | ||
+ | a <- lm(base$Hippocampus ~ base$ICV) | ||
+ | base$aHV = base$Hippocampus - a$coefficients[[2]]*(base$ICV - mean(base$ICV, | ||
+ | postscript(output_fig, | ||
+ | plot(base$AGE, | ||
+ | dev.off() | ||
+ | a <- lm(base$MidTemp ~ base$ICV) | ||
+ | base$aMidTemp = base$MidTemp - a$coefficients[[2]]*(base$ICV - mean(base$ICV, | ||
+ | output_fig=" | ||
+ | postscript(output_fig, | ||
+ | plot(base$AGE, | ||
+ | dev.off() | ||
+ | a <- lm(base$Entorhinal ~ base$ICV) | ||
+ | base$aEntorhinal = base$Entorhinal - a$coefficients[[2]]*(base$ICV - mean(base$ICV, | ||
+ | output_fig=" | ||
+ | postscript(output_fig, | ||
+ | plot(base$AGE, | ||
+ | dev.off() | ||
+ | </ | ||
+ | ++++ | ||
+ | |||
+ | OK, ya puestos también podemos hacerlo con las WMH calculadas desde T2W. Yo uso PGS, para las WMH de T2w, asi que tengo que pegarlas a las tablas, | ||
+ | |||
+ | (Ejemplo con facehbi) | ||
+ | |||
+ | < | ||
+ | [osotolongo@brick03 facehbi]$ sed ' | ||
+ | [osotolongo@brick03 facehbi]$ sed -i ' | ||
+ | [osotolongo@brick03 facehbi]$ join -t, codes.csv facehbi_wmh_metrics.csv | awk -F',' | ||
+ | [osotolongo@brick03 facehbi]$ ./ | ||
+ | [osotolongo@brick03 facehbi]$ xnat_pullfs.pl -s aseg -p facehbi -o base_aseg.csv | ||
+ | [osotolongo@brick03 facehbi]$ xnat_pullfs.pl -s aparc -p facehbi -o base_aparc.csv | ||
+ | [osotolongo@brick03 facehbi]$ join -t, base_aseg.csv base_aparc.csv > base_full.csv | ||
+ | [osotolongo@brick03 facehbi]$ (head -n 1 facehbi_age_data.csv && tail -n +2 facehbi_age_data.csv | sort -t, -n)> facehbi_age_data_sorted.csv | ||
+ | [osotolongo@brick03 facehbi]$ join -t, facehbi_age_data_sorted.csv facehbi_wmh.csv > facehbi_age_wmh.csv | ||
+ | [osotolongo@brick03 facehbi]$ join -t, base_full.csv facehbi_age_wmh.csv > input_data.csv | ||
+ | |||
+ | </ | ||
+ | |||
+ | Claro que aqui hay que usar la tabla de UCD WMH, | ||
+ | |||
+ | < | ||
+ | pop <- adnimerge[(adnimerge$DX==" | ||
+ | ucd_wmh -> ucd_t | ||
+ | ucd_t$VISCODE <- ifelse(ucd_t$VISCODE == " | ||
+ | ucd_t$VISCODE <- ifelse(ucd_t$VISCODE == " | ||
+ | pop <- merge(pop, ucd_t, by=c(" | ||
+ | </ | ||
+ | |||
+ | y despues modificar un poco las de nuestro proyecto para que cuadren las unidades, | ||
+ | |||
+ | < | ||
+ | base$TOTAL_WMH = base$WMH*0.001 | ||
+ | </ | ||
+ | |||
+ | ++++ OK, ya puestos también podemos hacerlo con las WMH calculadas desde T2W | | ||
+ | <code Rmarkdown> | ||
+ | library(" | ||
+ | library(" | ||
+ | library(" | ||
+ | library(" | ||
+ | input_file=" | ||
+ | output_file=" | ||
+ | output_fig=" | ||
+ | pop <- adnimerge[(adnimerge$DX==" | ||
+ | ucd_wmh -> ucd_t | ||
+ | ucd_t$VISCODE <- ifelse(ucd_t$VISCODE == " | ||
+ | ucd_t$VISCODE <- ifelse(ucd_t$VISCODE == " | ||
+ | pop <- merge(pop, ucd_t, by=c(" | ||
+ | pop$ND = as.factor(ifelse(pop$DX == " | ||
+ | xt <- pop[, c(" | ||
+ | classifier_cl <- naiveBayes(ND ~ ., data = xt) | ||
+ | base <- read.csv(input_file) | ||
+ | base$Hippocampus = base$Left.Hippocampus + base$Right.Hippocampus | ||
+ | base$Entorhinal = base$lh.entorhinal.GrayVol + base$rh.entorhinal.GrayVol | ||
+ | base$Ventricles <- base$Left.Inf.Lat.Vent + base$Right.Inf.Lat.Vent + base$Left.Lateral.Ventricle + base$Right.Lateral.Ventricle | ||
+ | base$MidTemp = base$lh.middletemporal.GrayVol + base$rh.middletemporal.GrayVol | ||
+ | base$ICV = base$eTIV | ||
+ | base$TOTAL_WMH = base$WMH*0.001 | ||
+ | base$ND <- predict(classifier_cl, | ||
+ | base$posterior <- predict(classifier_cl, | ||
+ | base2e = base[, c(" | ||
+ | write.csv(base2e, | ||
+ | a <- lm(base$Hippocampus ~ base$ICV) | ||
+ | base$aHV = base$Hippocampus - a$coefficients[[2]]*(base$ICV - mean(base$ICV, | ||
+ | postscript(output_fig, | ||
+ | plot(base$AGE, | ||
+ | dev.off() | ||
+ | a <- lm(base$MidTemp ~ base$ICV) | ||
+ | base$aMidTemp = base$MidTemp - a$coefficients[[2]]*(base$ICV - mean(base$ICV, | ||
+ | output_fig=" | ||
+ | postscript(output_fig, | ||
+ | plot(base$AGE, | ||
+ | dev.off() | ||
+ | a <- lm(base$Entorhinal ~ base$ICV) | ||
+ | base$aEntorhinal = base$Entorhinal - a$coefficients[[2]]*(base$ICV - mean(base$ICV, | ||
+ | output_fig=" | ||
+ | postscript(output_fig, | ||
+ | plot(base$AGE, | ||
+ | dev.off() | ||
+ | |||
+ | </ | ||
+ | |||
+ | ++++ (**NO WAY**, explicar como se hace que hay que meter el ucd_wmh de ADNI y sacar wl WMH con PGS) | ||
+ | |||
+ | Con BIOFACE: | ||
+ | |||
+ | ^ no WMH ^ T1w WMH ^ T2w WMH ^ | ||
+ | | {{ : | ||
+ | |||
+ | ^ ^ T1w WMH ^ T2w WMH ^ | ||
+ | | -2+ | 0 | 1 (1%) | | ||
+ | | +2- | 9 (10%) | 4 (4%) | | ||
+ | |||
+ | Con FACEHBI: | ||
+ | |||
+ | ^ no WMH ^ T1w WMH ^ T2w WMH ^ | ||
+ | | {{ : | ||
+ | |||
+ | ^ ^ T1w WMH ^ T2w WMH ^ | ||
+ | | -2+ | 0 | 0 | | ||
+ | | +2- | 21 (4%) | 10 (2%) | |
neuroimagen/bioface_atn.1630313375.txt.gz · Last modified: 2021/08/30 08:49 by osotolongo