Loading and preprocessing the data

Load data

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))

Process Laino data

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"

Process UNICAL data

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"

Define and preprocess final dataset

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  
##                                                      
## 

Data previous Laino Screening

require("xlsx")
laino_prev <- read.xlsx("./Schedario Anagrafiche Gozzo adulti.xlsx",sheetIndex = 1,rowIndex = c(2:727),colIndex = c(1:16))

Preprocess previous Laino dataset

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

Age distribution

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.

Sex distribution

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%

Ioduria

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 and Thyroid Volume

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


Noduli Tiroidei

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.


Antibodies