Evolución de las retractaciones de artículos

julia
Autor/a

runjaj

Fecha de publicación

12 de junio de 2026

Fecha de última modificación

12 de junio de 2026

Hace unos días leía que se había retractado un artículo muy citado sobre los beneficios del uso de la IA en el aprendizaje. El resultado era muy contraintuitivo y, de hecho, no es cierto.

Esto me hizo pensar que últimamente han aumentado mucho el número de retractaciones de artículos de investigación y me planteé ver la evolución. De paso era una buena excusa para aprender un par de cosas sobre el procesado de datos con Julia y el paquete de análisis de datos Tidier.jl, que está inspirado en el tidyverse de R.

Carga de la librería

El uso es muy sencillo, solo tenemos que cargar la librería Tidier y ya se ocupa de todo:

using Tidier

Datos a procesar

Lo primero es encontrar una base de datos con artículos retirados. Afortunadamente Retraction Watch recoge esta información, que habitualmente se encuentra muy dispersa.

Tiene la base de datos en un fichero CSV que podemos leer:

rdb = read_csv("https://gitlab.com/crossref/retraction-watch-data/-/raw/main/retraction_watch.csv");

He añadido un ; para evitar la salida del comando, ya que muestra las primeras y las últimas entradas de la base de datos y no se trata de que la lectura de este post quede muy farragosa.

Podemos hacernos una idea de la estructura de la base de datos con @glimpse:

@glimpse rdb
Rows: 70529
Columns: 21
.Record ID     Union{Missing, Int64}70871, 70868, 70751, 70731, 70730, 70729, 70
.Title         Union{Missing, String}The Uptake of Apoptotic Cells Drives Coxiel
.Subject       Union{Missing, String}(BLS) Microbiology;(HSC) Medicine - General
.Institution   Union{Missing, String}Unité de Recherche sur les Maladies Infecti
.Journal       Union{Missing, String}PLoS Pathogens, PLoS Neglected Tropical Dis
.Publisher     Union{Missing, String}PLoS, PLoS, Elsevier, Springer - Nature Pub
.Country       Union{Missing, String}France, Senegal, Egypt, Saudi Arabia, China
.Author        Union{Missing, String}Marie Benoit;Eric Ghigo;Christian Capo;Didi
.URLS          Union{Missing, String}https://retractionwatch.com/?s=Didier+Raoul
.ArticleType   Union{Missing, String}Research Article;, Research Article;, Clini
.RetractionDateUnion{Missing, InlineStrings.String31}5/12/2026 0:00, 5/26/2026 0
.RetractionDOI Union{Missing, String}10.1371/journal.ppat.1014210, 10.1371/journ
.RetractionPubMedIDUnion{Missing, Int64}42118727, 42189775, 42139973, 0, 0, 0, 0
.OriginalPaperDateUnion{Missing, InlineStrings.String31}5/16/2008 0:00, 9/14/201
.OriginalPaperDOIUnion{Missing, String}10.1371/journal.ppat.1000066, 10.1371/jou
.OriginalPaperPubMedIDUnion{Missing, Int64}18483547, 20856858, 33045448, 0, 0, 0
.RetractionNatureUnion{Missing, InlineStrings.String31}Retraction, Retraction, R
.Reason        Union{Missing, String}Author Unresponsive;Concerns/Issues about H
.Paywalled     Union{Missing, InlineStrings.String7}No, No, No, No, No, No, No, 
.Notes         Union{Missing, String}missing, missing, missing, missing, missing
.Column21      Missing        missing, missing, missing, missing, missing, missi

Las columnas que nos van a interesar son RetractionDate y ArticleType, ya que me quiero centrar solo en los artículos de investigación. No quiero que aparezcan ni los estudios clínicos, comunicaciones a congresos o artículos de revisión.

Tabla con las estadísticas anuales

Tidier.jl es fantástico para trabajar con datos, es realmente sencillo. El procesado de las más de 70_000 entradas de la base de datos es casi instantáneo y con una sintaxis muy sencilla. Era la primera vez que lo utilizaba y solo me ha costado leer el tutorial y echar un par de vistazos a la documentación.

Todo el procesao se hace aquí:

tabla = @chain rdb begin
                @filter ArticleType=="Research Article;"
                @mutate(Year = year(mdy_hm(RetractionDate)))
                @group_by Year
                @summarise n=n()
                @arrange desc(Year)
        end
55×2 DataFrame
30 rows omitted
Row Year n
Int64 Int64
1 2026 717
2 2025 3499
3 2024 5793
4 2023 11820
5 2022 4406
6 2021 4229
7 2020 2777
8 2019 2628
9 2018 1664
10 2017 1389
11 2016 1391
12 2015 1172
13 2014 790
44 1983 5
45 1982 5
46 1981 2
47 1980 3
48 1977 9
49 1975 2
50 1971 1
51 1970 1
52 1968 1
53 1967 2
54 1966 1
55 1960 1

Aquí hay una secuencia de operaciones para crear una tabla, que he llamado tabla, con el número de retrataciones por año:

  1. Selección con @filter de las entradas de la base de datos que son artículos de investigación.
  2. Creación de la columna Year a partir de la fecha de retirada del artículo.
  3. Agrupamos con @group_by las entradas de la base de datos por años.
  4. Con @summarise contamos el número de artículos en cada grupo.
  5. Para que la tabla quede más arreglada, la ordenamos en orden descendente de año con @arrange.

Viendo la tabla, se observa como el número de retractaciones aumenta con los años.

Creación de figuras

Una tabla está bien, pero (casi) siempre es mejor un gráfico.

Hacer los gráficos también es muy sencillo:

ggplot(tabla, @aes(x=Year, y=n)) + 
    geom_line(color=:teal, linewidth=2) + 
    geom_point(color=:red, stroke=1, strokecolor="black", size=15, alpha=0.8) + 
    theme_light()

Puede resultar interesante representar en eje y en escala logarítmica, lo que también resulta muy sencillo:

ggplot(tabla, @aes(x=Year, y=n)) + 
    geom_line(color=:teal, linewidth=2) + 
    geom_point(color=:red, stroke=1, strokecolor="black", size=15, alpha=0.8) + 
    scale_y_log10() +
    theme_light()

Conclusión

La primera conclusion es que Tidier.jl es una maravilla. Es rápido y fácil de usar. Se entiende que tidyverse y ggplot sean razones por las que hay muchos usuarios de R.

La segunda conclusión es que entre el uso de la IA, la falta de honradez de algunos autores, la presión por publicar, etc. está haciendo que el número de retractaciones de papers se esté disparando y nada hace pensar que la situación vaya a mejorar. Todo lo contrario.