mercoledì 20 novembre 2024

Come eliminare i messaggi di avvertimento (warning)

Può accadere di volere eliminare i messaggi di avvertimento (warning) che compaiono durante l'esecuzione di uno script. Si prenda ad esempio il codice seguente, che calcola e traccia una regressione antitòna [1]. Copiate e incollate nella Console di R questo script e premete ↵ Invio.

# REGRESSIONE MONOTÒNA (ANTITÒNA) con il pacchetto fdrtool 
#
library(fdrtool) # carica il pacchetto per la regressione
bmi <- read.table("c:/Rdati/bmi.csv", header=TRUE, sep=";", row.names="Nazione") # importa i dati
windows() # apre e inizializza una nuova finestra grafica
#
fdr <- monoreg(bmi$obeso, bmi$sovrappeso, type="antitonic") # calcola la regressione antitòna
#
plot(bmi$obeso, bmi$sovrappeso, main="Regressione monotòna (antitòna)", xlab="Soggetti obesi in %", ylab="Soggetti sovrappeso in %") # riporta il grafico con la distribuzione dei dati
lines(fdr$x, fdr$yf, col="red") # sovrappone la regressione 
#

Dopo avere caricato il pacchetto e i dati, durante il calcolo della regressione mediante la funzione monoreg() compaiono alcuni messaggi di avvertimento

Messaggi di avvertimento:
1: In monoreg(bmi$obeso, bmi$sovrappeso, type = "antitonic") :
  Duplicated x value (x=14) detected!
The corresponding weights and y values will be merged.
2: In monoreg(bmi$obeso, bmi$sovrappeso, type = "antitonic") :
  Duplicated x value (x=18.7) detected!
The corresponding weights and y values will be merged.
3: In monoreg(bmi$obeso, bmi$sovrappeso, type = "antitonic") :
  Duplicated x value (x=17.3) detected!
The corresponding weights and y values will be merged.

che avvertono che alcuni valori in ascisse sono duplicati. In effetti nei dati della variabile obeso che potete visualizzare digitando bmi compare due volte il valore 14.0 e due volte compaiono anche i valori 17.3 e 18.7. Ma non si tratta di un problema in quanto per questi valori la funzione provvede automaticamente a unire le y corrispondenti come riportato nel manuale del pacchetto [2]. Lo script è corretto e non presenta problemi, quindi la domanda: possiamo eliminare i messaggi di avvertimento? La risposta è sì, vediamo tre metodi per farlo.

1) I warning vengono soppressi limitatamente al codice incluso all'interno della funzione:
suppressWarnings(... codice per il quale i warning sono soppressi ...)

Esempio:

# REGRESSIONE MONOTÒNA (ANTITÒNA) con il pacchetto fdrtool 
#
library(fdrtool) # carica il pacchetto per la regressione
bmi <- read.table("c:/Rdati/bmi.csv", header=TRUE, sep=";", row.names="Nazione") # importa i dati
windows() # apre e inizializza una nuova finestra grafica
#
fdr <- suppressWarnings(monoreg(bmi$obeso, bmi$sovrappeso, type="antitonic")) # calcola la regressione antitòna
#
plot(bmi$obeso, bmi$sovrappeso, main="Regressione monotòna (antitòna)", xlab="Soggetti obesi in %", ylab="Soggetti sovrappeso in %") # riporta il grafico con la distribuzione dei dati
lines(fdr$x, fdr$yf, col="red") # sovrappone la regressione 
#

2) I warning sono soppressi globalmente all'interno di tutta la sessione:
options(warn=-1)

Esempio:

# REGRESSIONE MONOTÒNA (ANTITÒNA) con il pacchetto fdrtool 
#
library(fdrtool) # carica il pacchetto per la regressione
bmi <- read.table("c:/Rdati/bmi.csv", header=TRUE, sep=";", row.names="Nazione") # importa i dati
windows() # apre e inizializza una nuova finestra grafica
options(warn=-1)
#
fdr <- monoreg(bmi$obeso, bmi$sovrappeso, type="antitonic") # calcola la regressione antitòna
#
plot(bmi$obeso, bmi$sovrappeso, main="Regressione monotòna (antitòna)", xlab="Soggetti obesi in %", ylab="Soggetti sovrappeso in %") # riporta il grafico con la distribuzione dei dati
lines(fdr$x, fdr$yf, col="red") # sovrappone la regressione 
#

In questo caso chiudete la sessione di R e fate attenzione a NON salvare l'area di lavoro per evitare che la soppressione dei warning rimanga attiva nelle sessioni successive, un fatto che potrebbe ovviamente creare problemi.

3) Con getOption("warn") viene salvata la configurazione di default, poi i warning sono soppressi globalmente, ma al termine dell'esecuzione del codice che ne prevede la soppressione o comunque al termine dello script i warning sono ripristinati:
wconfig <- getOption("warn") 
options(warn=-1)
... codice per il quale i warning sono soppressi ...
options(warn=wconfig)

Esempio:

# REGRESSIONE MONOTÒNA (ANTITÒNA) con il pacchetto fdrtool 
#
library(fdrtool) # carica il pacchetto per la regressione
bmi <- read.table("c:/Rdati/bmi.csv", header=TRUE, sep=";", row.names="Nazione") # importa i dati
windows() # apre e inizializza una nuova finestra grafica
wconfig <- getOption("warn") # salva la configurazione corrente
options(warn=-1) # sopprime i warning
#
fdr <- monoreg(bmi$obeso, bmi$sovrappeso, type="antitonic") # calcola la regressione antitòna
#
plot(bmi$obeso, bmi$sovrappeso, main="Regressione monotòna (antitòna)", xlab="Soggetti obesi in %", ylab="Soggetti sovrappeso in %") # riporta il grafico con la distribuzione dei dati
lines(fdr$x, fdr$yf, col="red") # sovrappone la regressione 
#
options(warn=wconfig) # ripristina la configurazione corrente
#

Con l'esecuzione di questo script i warning non compaiono, ma se ora eseguite di seguito il codice originario riportato nel primo script i warning compaiono nuovamente. 

Va da sé che quest'ultima soluzione, che disabilita i warning ma al termine li ripristina, è quella più elegante e più sicura ed è la soluzione raccomandata.
 

----------


[2] A pagina 14 del Reference manual del pacchetto fdrtool è riportato: "If several identical x values are given as input, the corresponding y values and the weights w are automatically merged, and a warning is issued".
https://cran.r-project.org/web/packages/fdrtool/fdrtool.pdf

Nessun commento:

Posta un commento