# Precision diagnostica para detectar lesiones periapicales entre panoramica y periapical con CBCT como gold standard
# acuerdo entre observadores
df <- read.csv("precisiondiagnosticapanoperiapicalcbct.csv", header = TRUE, sep = ",")
df <- subset(df, select = c(1:10)) #hay dos columnas extras, las remuevo
df<- df[complete.cases(df),] # omito todos los NA
#veo los datos
str(df)
## 'data.frame': 42 obs. of 10 variables:
## $ caso : int 1 2 3 4 5 6 7 8 9 10 ...
## $ CBCT : int 1 1 1 1 0 1 1 1 1 0 ...
## $ pano1.obs1: int 1 1 1 1 0 1 0 1 1 0 ...
## $ pano1.obs2: int 1 1 1 1 0 1 1 0 1 0 ...
## $ pa1.obs1 : int 1 1 1 1 0 1 0 1 1 0 ...
## $ pa1.obs2 : int 1 1 1 0 0 1 0 1 1 0 ...
## $ pano2.obs1: int 1 1 1 1 0 1 0 0 1 0 ...
## $ pano2.obs2: int 1 1 1 1 0 1 1 0 1 0 ...
## $ pa2.obs1 : int 1 1 1 1 0 1 1 1 1 0 ...
## $ pa2.obs2 : int 1 1 1 0 0 1 0 1 1 0 ...
head(df)
## caso CBCT pano1.obs1 pano1.obs2 pa1.obs1 pa1.obs2 pano2.obs1 pano2.obs2
## 1 1 1 1 1 1 1 1 1
## 2 2 1 1 1 1 1 1 1
## 3 3 1 1 1 1 1 1 1
## 4 4 1 1 1 1 0 1 1
## 5 5 0 0 0 0 0 0 0
## 6 6 1 1 1 1 1 1 1
## pa2.obs1 pa2.obs2
## 1 1 1
## 2 1 1
## 3 1 1
## 4 1 0
## 5 0 0
## 6 1 1
df
## caso CBCT pano1.obs1 pano1.obs2 pa1.obs1 pa1.obs2 pano2.obs1 pano2.obs2
## 1 1 1 1 1 1 1 1 1
## 2 2 1 1 1 1 1 1 1
## 3 3 1 1 1 1 1 1 1
## 4 4 1 1 1 1 0 1 1
## 5 5 0 0 0 0 0 0 0
## 6 6 1 1 1 1 1 1 1
## 7 7 1 0 1 0 0 0 1
## 8 8 1 1 0 1 1 0 0
## 9 9 1 1 1 1 1 1 1
## 10 10 0 0 0 0 0 0 0
## 11 11 1 1 0 0 0 1 0
## 12 12 1 1 1 1 1 1 1
## 13 13 1 1 0 0 0 0 0
## 14 14 1 1 1 1 0 1 1
## 15 15 0 0 0 0 0 0 0
## 16 16 1 0 1 0 0 0 0
## 17 17 1 0 0 0 0 0 0
## 18 18 1 1 1 0 0 1 1
## 19 19 1 1 1 0 0 0 1
## 20 20 0 1 0 0 0 0 0
## 21 21 1 0 0 1 1 0 0
## 22 22 1 1 1 1 1 1 1
## 23 23 1 1 0 1 1 1 1
## 24 24 1 1 0 1 1 1 1
## 25 25 0 0 0 0 0 0 0
## 26 26 1 0 0 0 0 0 0
## 27 27 0 0 1 0 0 0 1
## 28 28 1 0 0 0 0 0 0
## 29 29 1 1 1 1 1 1 1
## 30 30 1 1 0 1 0 1 0
## 31 31 0 0 0 0 0 0 0
## 32 32 1 0 1 1 0 0 0
## 33 33 1 0 0 0 0 0 0
## 34 34 1 1 1 1 1 0 1
## 35 35 1 0 1 0 0 0 0
## 36 36 0 0 0 0 0 0 0
## 37 37 1 0 1 0 0 1 1
## 38 38 0 1 1 0 0 0 1
## 39 39 1 1 1 1 1 1 0
## 40 40 1 1 1 1 1 1 1
## 41 41 1 1 1 0 1 0 1
## 42 42 0 1 0 0 0 0 0
## pa2.obs1 pa2.obs2
## 1 1 1
## 2 1 1
## 3 1 1
## 4 1 0
## 5 0 0
## 6 1 1
## 7 1 0
## 8 1 1
## 9 1 1
## 10 0 0
## 11 1 0
## 12 1 1
## 13 1 0
## 14 1 1
## 15 0 1
## 16 0 0
## 17 1 0
## 18 0 1
## 19 0 0
## 20 0 0
## 21 1 0
## 22 1 1
## 23 1 1
## 24 1 1
## 25 0 0
## 26 0 0
## 27 0 0
## 28 0 0
## 29 1 1
## 30 1 0
## 31 1 0
## 32 0 0
## 33 1 0
## 34 1 1
## 35 1 0
## 36 0 0
## 37 0 0
## 38 0 0
## 39 1 1
## 40 1 1
## 41 1 0
## 42 0 0
# para el kappa
install.packages("irr")
## Error in install.packages : Updating loaded packages
library(irr)
# hago las matrices
# para las radiografÃas
pano1<-as.matrix(df[,c(3,4)])
pano2<-as.matrix(df[,c(7,8)])
pa1<-as.matrix(df[,c(5,6)])
pa2<-as.matrix(df[,c(9,10)])
# para los observadores
obs1pano<-as.matrix(df[,c(3,7)])
obs1pa<-as.matrix(df[,c(5,9)])
obs2pano<-as.matrix(df[,c(4,8)])
obs2pa<-as.matrix(df[,c(6,10)])
####### kappa inter
#####################
# Kappa inter para los examenes
# pano
KappaPano1Inter <- kappa2(pano1, "unweighted")
KappaPano2Inter <- kappa2(pano2, "unweighted")
# periapical
KappaPa1Inter <- kappa2(pa1, "unweighted")
KappaPa2Inter <- kappa2(pa2, "unweighted")
####### kappa intra
#####################
# Kappa inter para los observadores
# 1
KappaObs1Pano <- kappa2(obs1pano, "unweighted")
KappaObs1Pa <- kappa2(obs1pa, "unweighted")
# 2
KappaObs2Pano <- kappa2(obs2pano, "unweighted")
KappaObs2Pa <- kappa2(obs2pa, "unweighted")
#reportes de kappa
# kappa inter para pano1
KappaPano1Inter # 0.321
## Cohen's Kappa for 2 Raters (Weights: unweighted)
##
## Subjects = 42
## Raters = 2
## Kappa = 0.321
##
## z = 2.09
## p-value = 0.0366
#kappa inter para pano 2
KappaPano2Inter # 0.571
## Cohen's Kappa for 2 Raters (Weights: unweighted)
##
## Subjects = 42
## Raters = 2
## Kappa = 0.571
##
## z = 3.74
## p-value = 0.000183
# kappa inter para periapical 1
KappaPa1Inter # 0.756
## Cohen's Kappa for 2 Raters (Weights: unweighted)
##
## Subjects = 42
## Raters = 2
## Kappa = 0.756
##
## z = 4.96
## p-value = 7.23e-07
# kappa inter para periapical 2
KappaPa2Inter # 0.408
## Cohen's Kappa for 2 Raters (Weights: unweighted)
##
## Subjects = 42
## Raters = 2
## Kappa = 0.408
##
## z = 2.9
## p-value = 0.00376
# kappa intra para obs 1 para pano
KappaObs1Pano # 0.583
## Cohen's Kappa for 2 Raters (Weights: unweighted)
##
## Subjects = 42
## Raters = 2
## Kappa = 0.583
##
## z = 3.99
## p-value = 6.53e-05
# kappa intra para obs 2 para pano
KappaObs2Pano # 0.714
## Cohen's Kappa for 2 Raters (Weights: unweighted)
##
## Subjects = 42
## Raters = 2
## Kappa = 0.714
##
## z = 4.65
## p-value = 3.32e-06
# kappa intra para obs 1 para periapicales
KappaObs1Pa # 0.581
## Cohen's Kappa for 2 Raters (Weights: unweighted)
##
## Subjects = 42
## Raters = 2
## Kappa = 0.581
##
## z = 3.98
## p-value = 6.82e-05
# kappa intra para obs 1 para periapicales
KappaObs2Pa # 0.751
## Cohen's Kappa for 2 Raters (Weights: unweighted)
##
## Subjects = 42
## Raters = 2
## Kappa = 0.751
##
## z = 4.87
## p-value = 1.11e-06
### Precisión diagnóstica
######################
install.packages("caret")
## Error in install.packages : Updating loaded packages
library(caret)
str(df)
## 'data.frame': 42 obs. of 10 variables:
## $ caso : int 1 2 3 4 5 6 7 8 9 10 ...
## $ CBCT : int 1 1 1 1 0 1 1 1 1 0 ...
## $ pano1.obs1: int 1 1 1 1 0 1 0 1 1 0 ...
## $ pano1.obs2: int 1 1 1 1 0 1 1 0 1 0 ...
## $ pa1.obs1 : int 1 1 1 1 0 1 0 1 1 0 ...
## $ pa1.obs2 : int 1 1 1 0 0 1 0 1 1 0 ...
## $ pano2.obs1: int 1 1 1 1 0 1 0 0 1 0 ...
## $ pano2.obs2: int 1 1 1 1 0 1 1 0 1 0 ...
## $ pa2.obs1 : int 1 1 1 1 0 1 1 1 1 0 ...
## $ pa2.obs2 : int 1 1 1 0 0 1 0 1 1 0 ...
# primero, como son cuatro pano (dos del obs1 y dos del obs2)
# voy a crear un CBCT x 4
cbct4 <- rep(df$CBCT, 4)
cbct4
## [1] 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1
## [36] 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 0 1
## [71] 1 1 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1
## [106] 1 1 1 0 1 0 1 1 1 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1
## [141] 0 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 0 1 0 1 1 1 0
# ahora combino todas las mediciones de cada test
pano <- c(df$pano1.obs1, df$pano1.obs2, df$pano2.obs1, df$pano2.obs2)
pa <- c(df$pa1.obs1, df$pa1.obs2, df$pa2.obs1, df$pa2.obs2)
# hago una tabla para test diagnostico
cbctXpano <- with(df, table(pano, cbct4))
cbctXpa <- with(df, table(pa, cbct4))
cbctXpano
## cbct4
## pano 0 1
## 0 33 48
## 1 7 80
cbctXpa
## cbct4
## pa 0 1
## 0 38 52
## 1 2 76
# Evaluar precisión diagnostica
Panoramica <- confusionMatrix(pano, cbct4, positive="1")
Periapical <- confusionMatrix(pa, cbct4, positive="1")
#Precisión diagnostica
# Panorámicas
Panoramica
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 33 48
## 1 7 80
##
## Accuracy : 0.6726
## 95% CI : (0.5961, 0.7429)
## No Information Rate : 0.7619
## P-Value [Acc > NIR] : 0.9967
##
## Kappa : 0.3328
## Mcnemar's Test P-Value : 6.906e-08
##
## Sensitivity : 0.6250
## Specificity : 0.8250
## Pos Pred Value : 0.9195
## Neg Pred Value : 0.4074
## Prevalence : 0.7619
## Detection Rate : 0.4762
## Detection Prevalence : 0.5179
## Balanced Accuracy : 0.7250
##
## 'Positive' Class : 1
##
# ver en http://araw.mede.uic.edu/cgi-bin/testcalc.pl?DT=80&Dt=48&dT=7&dt=33&2x2=Compute
# Periapical
Periapical
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 38 52
## 1 2 76
##
## Accuracy : 0.6786
## 95% CI : (0.6023, 0.7484)
## No Information Rate : 0.7619
## P-Value [Acc > NIR] : 0.9946
##
## Kappa : 0.3803
## Mcnemar's Test P-Value : 2.592e-11
##
## Sensitivity : 0.5938
## Specificity : 0.9500
## Pos Pred Value : 0.9744
## Neg Pred Value : 0.4222
## Prevalence : 0.7619
## Detection Rate : 0.4524
## Detection Prevalence : 0.4643
## Balanced Accuracy : 0.7719
##
## 'Positive' Class : 1
##
# ver en http://araw.mede.uic.edu/cgi-bin/testcalc.pl?DT=76&Dt=52&dT=1&dt=38&2x2=Compute
# elijo solo pano 2 por su kappa de 0.57 y periapical 1 por kappa 0.756
# hago un cbct2 de 84
cbct2 <- rep(df$CBCT, 2)
mejorpano <- c(df$pano2.obs1, df$pano2.obs2)
mejorperiapical <- c(df$pa1.obs1, df$pa1.obs2)
MejorPanoramica <- confusionMatrix(mejorpano, cbct2, positive="1")
MejorPeriapical <- confusionMatrix(mejorperiapical, cbct2, positive="1")
# precisión diagnostica utilizando las pano y pa con mejor kappa (pano 2 y pa1)
# precisión diagnostica de pano2
MejorPanoramica
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 18 27
## 1 2 37
##
## Accuracy : 0.6548
## 95% CI : (0.5431, 0.7552)
## No Information Rate : 0.7619
## P-Value [Acc > NIR] : 0.9905
##
## Kappa : 0.3344
## Mcnemar's Test P-Value : 8.324e-06
##
## Sensitivity : 0.5781
## Specificity : 0.9000
## Pos Pred Value : 0.9487
## Neg Pred Value : 0.4000
## Prevalence : 0.7619
## Detection Rate : 0.4405
## Detection Prevalence : 0.4643
## Balanced Accuracy : 0.7391
##
## 'Positive' Class : 1
##
# precisión diagnostica de pa1
MejorPeriapical
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 20 29
## 1 0 35
##
## Accuracy : 0.6548
## 95% CI : (0.5431, 0.7552)
## No Information Rate : 0.7619
## P-Value [Acc > NIR] : 0.9905
##
## Kappa : 0.365
## Mcnemar's Test P-Value : 1.999e-07
##
## Sensitivity : 0.5469
## Specificity : 1.0000
## Pos Pred Value : 1.0000
## Neg Pred Value : 0.4082
## Prevalence : 0.7619
## Detection Rate : 0.4167
## Detection Prevalence : 0.4167
## Balanced Accuracy : 0.7734
##
## 'Positive' Class : 1
##
install.packages("pROC")
## Error in install.packages : Updating loaded packages
install.packages("doParallel")
## Error in install.packages : Updating loaded packages
library(pROC)
library(doParallel)
table(pano)
## pano
## 0 1
## 81 87
table(cbct4)
## cbct4
## 0 1
## 40 128
rocPano <- plot.roc(cbct4, pano , percent = TRUE, main="Smoothing")

rocPeriapical <- plot.roc(cbct4, pa , percent = TRUE, main="Smoothing")

# en un solo gráfico
# calculo las áreas bajo la curva
AUCPano <- auc(cbct4, pano)
AUCPano
## Area under the curve: 0.725
AUCPa <- auc(cbct4, pa)
AUCPa
## Area under the curve: 0.7719
# hago el gráfico
par(mfrow=c(1,1)) #n?mero de figuras en el plot;c(filas,columnas)
par(mar=c(5,5,3,2)+0.1) #margenes
rocobj1 <- plot.roc(cbct4, pano , main="Comparación de curvas ROC", percent=TRUE, col="#1c61b6",
xlab="Especificidad (%)", ylab="Sensibilidad (%)",
ylim=c(0,100))
rocobj2 <- lines.roc(cbct4, pa , percent=TRUE, col="#008600")
testobj <- roc.test(rocobj1, rocobj2)
text(50, 50, labels=paste("p-value =", format.pval(testobj$p.value)), adj=c(0, .5))
text(70, 66, labels=paste("AUC Panorámica =", AUCPano), adj=c(0, .5), col="#1c61b6")
text(90, 79, labels=paste("AUC Periapical =", AUCPa), adj=c(0, .5), col="#008600")
legend("bottomright", legend=c("Panorámica", "Periapical"), col=c("#1c61b6", "#008600"), lwd=2)
