Loading data from the 3 excel file
require("xlsx")
laino <- read.xlsx("./Screening Laino Borgo per Anna.xlsx",sheetIndex = 1,rowIndex = c(1:275),colIndex = c(1:18))
unical1 <- read.xlsx("./screening unical prima parte.xlsx",sheetIndex = 1,rowIndex = c(1:88),colIndex = c(1:18))
unical2 <- read.xlsx("./UNICAL SECONDA PARTE per Anna.xlsx",sheetIndex = 1,rowIndex = c(1:202),colIndex = c(1:17))
dataTiroide <- data.frame("id"=sprintf("LAI%04d", laino$ID))
dataTiroide$sex <- toupper(laino$SEX)
dataTiroide$age <- round(as.numeric(as.Date("2015-03-01") - laino$DN)/365.25,1)
Calculate Laino Thyroid Volume and Goiter presence
rowProds2 <- function(a) Reduce("*", as.data.frame(a))
dataTiroide$tv <- round((rowProds2(laino[,c("APDX","LLDX","LONGDX")])*.52 + rowProds2(laino[,c("APSX","LLSX","LONSX")])*.52)/1000,1)
dataTiroide$goiter <- ifelse(dataTiroide$sex=="M" & dataTiroide$tv>25,"yes",ifelse(dataTiroide$sex=="F" & dataTiroide$tv>18,"yes","no"))
Define Laino US structure var
dataTiroide[grep(pattern = "nor",laino$STRUTTURA,ignore.case = T),"us"] <- "Normo"
dataTiroide[grep(pattern = "ipo",laino$STRUTTURA,ignore.case = T),"us"] <- "IpoEco"
dataTiroide[grep(pattern = "ok",laino$STRUTTURA,ignore.case = T),"us"] <- "Normo"
dataTiroide[grep(pattern = "nodulare",laino$STRUTTURA,ignore.case = T),"us"] <- "Normo"
dataTiroide[grep(pattern = "noduli",laino$STRUTTURA,ignore.case = T),"us"] <- "Normo"
dataTiroide[grep(pattern = "gozzo",laino$STRUTTURA,ignore.case = T),"us"] <- "Normo"
dataTiroide[grep(pattern = "Nodulo",laino$STRUTTURA,ignore.case = F),"us"] <- "Normo"
Define Laino nodules var
dataTiroide[grep(pattern = "no",laino$NODULI,ignore.case = T),"nodule"] <- "no"
dataTiroide[grep(pattern = "s",laino$NODULI,ignore.case = T),"nodule"] <- "yes"
Copy Laino Biochemical Data
dataTiroide$tsh <- laino$TSH
dataTiroide$abtg <- laino$Ab.TG
dataTiroide$abtpo <- laino$Ab.TPO
dataTiroide$ioduria <- laino$Ioduria
Define Laino Area
dataTiroide$area <- "Laino"
dataTiroide_u1 <- data.frame("id"=sprintf("UNI%04d", 1:NROW(unical1)))
dataTiroide_u1$sex <- toupper(unical1$sesso)
dataTiroide_u1$age <- round(as.numeric(as.Date("2015-03-01") - unical1$data.nascita)/365.25,1)
Calculate UNICAL1 Thyroid Volume and Goiter presence
dataTiroide_u1$tv <- round((rowProds2(unical1[,c("APDX","LLDX","LONGDX")])*.52 + rowProds2(unical1[,c("APSX","LLSX","LONGSX")])*.52)/1000,1)
dataTiroide_u1$goiter <- ifelse(dataTiroide_u1$sex=="M" & dataTiroide_u1$tv>25,"yes",ifelse(dataTiroide_u1$sex=="F" & dataTiroide_u1$tv>18,"yes","no"))
Define UNICAL1 US structure var
dataTiroide_u1[grep(pattern = "i",unical1$ECOGENICITA.,ignore.case = T),"us"] <- "IpoEco"
dataTiroide_u1[grep(pattern = "no",unical1$ECOGENICITA.,ignore.case = T),"us"] <- "Normo"
Define UNICAL1 nodules var
dataTiroide_u1[grep(pattern = "no",unical1$noduli,ignore.case = T),"nodule"] <- "no"
dataTiroide_u1[grep(pattern = "s",unical1$noduli,ignore.case = T),"nodule"] <- "yes"
Copy UNICAL1 Biochemical Data
dataTiroide_u1$tsh <- unical1$TSH
dataTiroide_u1$abtg <- unical1$ABTG
dataTiroide_u1$abtpo <- unical1$ABTPO
dataTiroide_u1$ioduria <- unical1$X.MEDIA.IODURIA
Define UNICAL1 Area
dataTiroide_u1$area <- "UNICAL"
UNICAL2 data
dataTiroide_u2 <- data.frame("id"=sprintf("UNI%04d", (1+NROW(unical1)):(NROW(unical1)+NROW(unical2))))
dataTiroide_u2$sex <- toupper(unical2$SESSO)
dataTiroide_u2$age <- round(as.numeric(as.Date("2015-03-01") - unical2$data.nascita)/365.25,1)
Calculate unical2 Thyroid Volume and Goiter presence
dataTiroide_u2$tv <- round((rowProds2(unical2[,c("AP.DX","LLDX","LONGDX")])*.52 + rowProds2(unical2[,c("APSX","LLSX","LONGSX")])*.52)/1000,1)
dataTiroide_u2$goiter <- ifelse(dataTiroide_u2$sex=="M" & dataTiroide_u2$tv>25,"yes",ifelse(dataTiroide_u2$sex=="F" & dataTiroide_u2$tv>18,"yes","no"))
Define unical2 US structure var
dataTiroide_u2[grep(pattern = "ipo",unical2$ECOGENICITA.,ignore.case = T),"us"] <- "IpoEco"
dataTiroide_u2[grep(pattern = "no",unical2$ECOGENICITA.,ignore.case = T),"us"] <- "Normo"
Define unical2 nodules var
dataTiroide_u2[grep(pattern = "o",unical2$NODULI,ignore.case = T),"nodule"] <- "no"
dataTiroide_u2[grep(pattern = "s",unical2$NODULI,ignore.case = T),"nodule"] <- "yes"
Copy unical2 Biochemical Data
dataTiroide_u2$tsh <- unical2$TSH..0.2.0.4.
dataTiroide_u2$abtg <- unical2$AbTg..30.
dataTiroide_u2$abtpo <- unical2$AbTPO...60.
dataTiroide_u2$ioduria <- unical2$Ioduria
Define unical2 Area
dataTiroide_u2$area <- "UNICAL"
Creating tiroide
from the Laino, UNICAL1 and UNICAL2 data:
tiroide <- rbind(dataTiroide,dataTiroide_u1,dataTiroide_u2)
tiroide[161,"age"] <- 81.1
tiroide$age_group <- cut(x = tiroide$age,breaks = c(0,25,45,55,65,85),labels = c("<25","25-44","45-54","55-64",">65"))
tiroide$ipoTir <- cut(tiroide$tsh,c(0,4,22),c("norm","ipoTir"))
tiroide$abtg_pos <- cut(tiroide$abtg,c(0,30,7000),c("neg","pos"))
tiroide$abtpo_pos <- cut(tiroide$abtpo,c(0,60,3500),c("neg","pos"))
tiroide$ab_pos <- interaction(tiroide$abtg_pos,tiroide$abtpo_pos)
tiroide$ab_pos <- factor(tiroide$ab_pos,levels = levels(tiroide$ab_pos),labels=c("neg-both","pos-AbTG","pos-AbTPO","pos-both"))
tiroide$iodoCarenza <- cut(tiroide$ioduria,c(0,20,50,100,300),c("grave","moderata","lieve","normale"))
tiroide$iodoCarenza <- factor(tiroide$iodoCarenza,levels(tiroide$iodoCarenza)[c(4:1)])
tiroide[115,"tv"] <- 23.0
head(tiroide)
## id sex age tv goiter us nodule tsh abtg abtpo ioduria
## 1 LAI0001 F 42.0 11.1 no IpoEco no 1.56 961.00 260.3 97.755
## 2 LAI0002 F 65.3 2.7 no IpoEco no 0.37 23.13 56.4 148.480
## 3 LAI0003 F 50.3 8.8 no IpoEco <NA> NA NA NA 73.495
## 4 LAI0004 F 50.1 10.0 no Normo <NA> 0.98 21.80 20.4 135.720
## 5 LAI0005 F 63.3 10.3 no Normo <NA> 1.00 29.00 19.8 173.735
## 6 LAI0006 F 50.4 18.4 yes Normo yes 0.35 15.80 17.9 67.070
## area age_group ipoTir abtg_pos abtpo_pos ab_pos iodoCarenza
## 1 Laino 25-44 norm pos pos pos-both lieve
## 2 Laino >65 norm neg neg neg-both normale
## 3 Laino 45-54 <NA> <NA> <NA> <NA> lieve
## 4 Laino 45-54 norm neg neg neg-both normale
## 5 Laino 55-64 norm neg neg neg-both normale
## 6 Laino 45-54 norm neg neg neg-both lieve
str(tiroide)
## 'data.frame': 562 obs. of 18 variables:
## $ id : Factor w/ 562 levels "LAI0001","LAI0002",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ sex : chr "F" "F" "F" "F" ...
## $ age : num 42 65.3 50.3 50.1 63.3 50.4 47.4 45.1 58.2 63.5 ...
## $ tv : num 11.1 2.7 8.8 10 10.3 18.4 67.5 6 23.3 21.9 ...
## $ goiter : chr "no" "no" "no" "no" ...
## $ us : chr "IpoEco" "IpoEco" "IpoEco" "Normo" ...
## $ nodule : chr "no" "no" NA NA ...
## $ tsh : num 1.56 0.37 NA 0.98 1 0.35 0.37 0.67 0.2 0.78 ...
## $ abtg : num 961 23.1 NA 21.8 29 ...
## $ abtpo : num 260.3 56.4 NA 20.4 19.8 ...
## $ ioduria : num 97.8 148.5 73.5 135.7 173.7 ...
## $ area : chr "Laino" "Laino" "Laino" "Laino" ...
## $ age_group : Factor w/ 5 levels "<25","25-44",..: 2 5 3 3 4 3 3 3 4 4 ...
## $ ipoTir : Factor w/ 2 levels "norm","ipoTir": 1 1 NA 1 1 1 1 1 1 1 ...
## $ abtg_pos : Factor w/ 2 levels "neg","pos": 2 1 NA 1 1 1 1 1 1 1 ...
## $ abtpo_pos : Factor w/ 2 levels "neg","pos": 2 1 NA 1 1 1 1 1 1 1 ...
## $ ab_pos : Factor w/ 4 levels "neg-both","pos-AbTG",..: 4 1 NA 1 1 1 1 1 1 1 ...
## $ iodoCarenza: Factor w/ 4 levels "normale","lieve",..: 2 1 2 1 1 2 2 2 3 2 ...
tiroide$sex <- as.factor(tiroide$sex)
tiroide$goiter <- as.factor(tiroide$goiter)
tiroide$us <- relevel(as.factor(tiroide$us),"Normo")
tiroide$nodule <- as.factor(tiroide$nodule)
tiroide$area <- as.factor(tiroide$area)
summary(tiroide)
## id sex age tv goiter
## LAI0001: 1 F:407 Min. :13.60 Min. : 0.00 no :505
## LAI0002: 1 M:155 1st Qu.:42.33 1st Qu.: 7.90 yes: 57
## LAI0003: 1 Median :52.20 Median : 10.45
## LAI0004: 1 Mean :50.75 Mean : 13.14
## LAI0005: 1 3rd Qu.:60.00 3rd Qu.: 14.80
## LAI0006: 1 Max. :84.90 Max. :166.20
## (Other):556
## us nodule tsh abtg
## Normo :427 no :370 Min. : 0.000 Min. : 6.90
## IpoEco:130 yes :183 1st Qu.: 0.900 1st Qu.: 19.68
## NA's : 5 NA's: 9 Median : 1.400 Median : 26.00
## Mean : 1.704 Mean : 107.80
## 3rd Qu.: 2.000 3rd Qu.: 35.17
## Max. :21.800 Max. :6680.90
## NA's :10 NA's :10
## abtpo ioduria area age_group ipoTir
## Min. : 6.10 Min. : 1.67 Laino :274 <25 : 18 norm :523
## 1st Qu.: 15.68 1st Qu.: 56.45 UNICAL:288 25-44:169 ipoTir: 25
## Median : 19.10 Median : 93.16 45-54:150 NA's : 14
## Mean : 92.09 Mean : 97.98 55-64:173
## 3rd Qu.: 31.23 3rd Qu.:129.65 >65 : 52
## Max. :3483.80 Max. :279.33
## NA's :10 NA's :24
## abtg_pos abtpo_pos ab_pos iodoCarenza
## neg :362 neg :479 neg-both :348 normale :243
## pos :190 pos : 73 pos-AbTG :131 lieve :182
## NA's: 10 NA's: 10 pos-AbTPO: 14 moderata: 90
## pos-both : 59 grave : 23
## NA's : 10 NA's : 24
##
##
require("xlsx")
laino_prev <- read.xlsx("./Schedario Anagrafiche Gozzo adulti.xlsx",sheetIndex = 1,rowIndex = c(2:727),colIndex = c(1:16))
laino1 <- data.frame("id"=sprintf("LAI1%03d", laino_prev$NA.))
laino1$sex <- toupper(laino_prev$F.M)
laino1$age <- round(as.numeric(laino_prev$Data - laino_prev$Data.nascita)/365.25,1)
laino1$age <- ifelse(laino1$age<0,laino1$age+100,laino1$age)
laino1$tv <- laino_prev$Volume.totale
laino1$goiter <- factor(laino_prev$PATOLOGIA,c("","SI"),c("no","yes"))
laino1$goiter <- factor(laino_prev$PATOLOGIA,c("","SI"),c("no","yes"))
laino1$area <- "Laino"
laino1[grep(pattern = "tireo",laino_prev$Note,ignore.case = T),"tx"] <- "si"
laino1$tx <- ifelse(is.na(laino1$tx),"no",laino1$tx)
laino1$tx <- factor(laino1$tx)
Define a dataset with old and new Laino Borgo data
laino_tot <- rbind(laino1[,1:6],dataTiroide[,c(1:5,12)])
laino_tot$screening <- factor(grepl(pattern = "LAI1",laino_tot$id,ignore.case = F),c("TRUE","FALSE"),c("old","new"))
laino_tot$age_group <- cut(x = laino_tot$age,breaks = c(0,25,45,55,65,85),labels = c("<25","25-44","45-54","55-64",">65"))
### Data Analysis
Analizzando la distribuzione dell’età per area di screening si vede chiaramente la differenza fra l’UNICAL, dove abbiamo solo soggetti in età da lavoro compresi fra 15 e 65 anni, e Laino dove sono presenti soggetti più giovani di 25 e più vecchi di 65 anni.
Sia dalla figura che dalla tabella si nota lo sbilanciamento tra i sessi: le donne rappresentano più del 70% dell’intero campione, l’80% a Laino e il 65 all’UNICAL.
Sex | Laino | UNICAL | Total |
---|---|---|---|
F | 217 | 190 | 407 |
79.20% | 65.97% | ||
M | 57 | 98 | 155 |
20.80% | 34.03% | ||
Total | 274 | 288 | 562 |
48.75% | 51.25% |
I livelli di ioduria sono significativamente più alti nei soggetti dell’UNICAL rispetto a Laino (p < 0.001), ma non ci sono differenze rispetto al sesso.
area | sex | median | iqr | mean | sd | min | max |
---|---|---|---|---|---|---|---|
Laino | F | 78.23 | 72.21 | 90.34 | 55.99 | 1.67 | 279.34 |
Laino | M | 74.46 | 74.99 | 89.14 | 57.15 | 4.63 | 236.47 |
UNICAL | F | 101.70 | 63.59 | 103.10 | 51.51 | 3.19 | 262.75 |
UNICAL | M | 110.08 | 70.93 | 109.76 | 52.33 | 14.98 | 251.25 |
Chiaramente l’incidenza di carenza di iodio è maggiore nell’area di Laino rispetto all’UNICAL, e questo sembra più accentuato nel sesso femminile.
Iodocarenza | Laino | UNICAL | Total |
---|---|---|---|
normale | 97 | 146 | 243 |
37.16% | 52.71% | ||
lieve | 97 | 85 | 182 |
37.16% | 30.69% | ||
moderata | 51 | 39 | 90 |
19.54% | 14.08% | ||
grave | 16 | 7 | 23 |
6.13% | 2.53% | ||
Total | 261 | 277 | 538 |
48.51% | 51.49% |
Dal grafico seguente non sembra sussistere nessuna associazione significativa fra l’età e i livelli di ioduria
Goiter | Laino | UNICAL | Total |
---|---|---|---|
no | 234 | 271 | 505 |
85.4% | 94.1% | ||
yes | 40 | 17 | 57 |
14.6% | 5.9% | ||
Total | 274 | 288 | 562 |
48.75% | 51.25% |
Dal confronto col precedente screening a Laino è chiaro come la prevalenza di Gozzo sia diminuita significativamente
Per quanto riguarda l’associazione fra età e volume della tiroide si possono notare le relazioni opposte tra uomini (descrescente) e donne (crescente) a Laino, mentre all’UNICAL nelle donne non si apprezza nessun particolare andamento e negli uomini l’andamento che sembra differente rispetto a Laino potrebbe dipendere dalla differente età dei 2 gruppi.
Dalla regressione lineare multivariata risultano differenze significative tra uomini rispetto alle donne e dell’UNICAL rispetto a Laino, mentre l’interazione tra le 2 variabili non risulta significativamente associata al volume della tiroide
Estimate | Std. Error | t value | p | |
---|---|---|---|---|
Intercept | 6.4666 | 5.0775 | 1.27 | 0.2034 |
sex-M | 3.3732 | 1.6801 | 2.01 | 0.0452 |
area-UNICAL | -3.7747 | 1.1775 | -3.21 | 0.0014 |
age | 0.0907 | 0.2164 | 0.42 | 0.6753 |
age^2 | 0.0009 | 0.0022 | 0.44 | 0.6633 |
sex-M*area-UNICAL | 2.7502 | 2.1743 | 1.26 | 0.2065 |
Di seguito la differenza di prevalenza del Gozzo tra maschi e femmine per diverse fasce di età , nelle 2 aree e nei due screening a Laino
È chiaro come la riduzione nella prevalenza di Gozzo sia più marcata nelle fasce di età più avanzate
Non sembrano esserci particolari differenze nei livelli di ioduria rispetto alla presenza di Gozzo, tranne che nei maschi di Laino dove la ioduria è significativamente minore tra i soggetti affetti da Gozzo.
area | sex | goiter | median | iqr | mean | sd | min | max |
---|---|---|---|---|---|---|---|---|
Laino | F | no | 78.59 | 73.44 | 90.54 | 53.90 | 1.67 | 279.34 |
Laino | F | yes | 72.88 | 62.98 | 89.24 | 67.52 | 4.23 | 267.88 |
Laino | M | no | 91.78 | 77.87 | 91.69 | 55.66 | 4.63 | 231.24 |
Laino | M | yes | 54.75 | 18.11 | 73.85 | 67.47 | 26.85 | 236.47 |
UNICAL | F | no | 99.30 | 58.10 | 101.84 | 50.52 | 3.19 | 262.75 |
UNICAL | F | yes | 113.22 | 92.84 | 124.71 | 65.72 | 40.85 | 257.35 |
UNICAL | M | no | 111.75 | 72.55 | 109.79 | 52.30 | 14.98 | 251.25 |
UNICAL | M | yes | 90.50 | 52.36 | 109.41 | 56.99 | 31.80 | 198.55 |
Per quanto riguarda i noduli tiroidei si nota una prevalenza signiifcativamente maggiore nei soggetti affetti da Gozzo.
Nodules | Laino | UNICAL | Total |
---|---|---|---|
no | 194 | 176 | 370 |
70.80% | 61.11% | ||
yes | 77 | 106 | 183 |
28.10% | 36.81% | ||
NA | 3 | 6 | 9 |
1.09% | 2.08% | ||
Total | 274 | 288 | 562 |
48.75% | 51.25% |
La presenza di valori nulli tra i soggetti di Laino è dovuta solo in minima parte alla presenza di soggetti con agenesia o tiroidectomizzati (num. 5), come di può notare dal grafico sottostante che illustra i soggetti con dati validi sulla struttura tiroidea all’esame ecografico.