Site icon R-bloggers

How often do researchers say they speculate? Nine literatures compared

[This article was first published on Pablo Bernabeu, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
  • Some research topics invite more explicit conjecture than others. Language evolution invited it for long enough that one of its learned societies closed the question down. The statutes that the Société de Linguistique de Paris adopted in 1866 declare, in their second article, that the society admits no communication concerning either the origin of language or the creation of a universal language (Société de Linguistique de Paris, 1866). Paul Vogt and I recounted that ban in a review of the field (Bernabeu & Vogt, 2015).

    Early speech leaves no trace, so an account of it can rarely be settled against a record, and accounts accumulate. That review found the same condition, with little direct evidence to work with and a high degree of speculation. Comparing fields on this score is hard, and database counts cannot rank them by how much they speculate. They can, however, show how often authors use a particular family of words in the title, abstract and keyword fields that Scopus indexes.

    Authors who speculate in print sometimes say so, in phrases such as “we speculate that” or “it is tempting to speculate”. The share of records that contain a form of speculat* is therefore an indicator of explicit wording in indexed metadata. It is not a measure of how much speculation an article contains, how well supported its claims are or how mature a research area is. Conventions for hedging, abstract writing and indexing can all affect the count.

    This post compares that share, year by year from 1980 to the present, across nine reference literatures. Six of them concern language: language evolution, language comprehension, language disorders, linguistic relativity, language teaching and the bilingual advantage. A seventh, sensorimotor simulation, is the topic of my own doctoral work on conceptual processing. The last two, artificial general intelligence and the hadron collider, lie outside the language sciences and serve as points of comparison. Speculation might be expected in the first, whereas the second is a field of large instruments and large collaborations. Each reference literature is defined by a query on the title, abstract and keywords. Within each year, the comparison counts the records that also match speculat* in those fields.

    Development

    The searches use my scopusflow package (Bernabeu, 2026) and are run by a script in the website’s repository. The counts it returns are saved with the post, so the figures can be reproduced without a Scopus API key. The nine queries are as follows.

    library(scopusflow)
    years <- 1980:as.integer(format(Sys.Date(), '%Y'))
    topics <- c(
    'language evolution' = '"language evolution" OR "evolution of language"',
    'language comprehension' = '"language comprehension"',
    'language disorders' = '"language disorders" OR "language disorder"',
    'linguistic relativity' = '"linguistic relativity"',
    'language teaching' = '"language teaching"',
    'bilingual advantage' = '"bilingual advantage" OR "bilingual advantages"',
    'sensorimotor simulation' = '"sensorimotor simulation"',
    'artificial general intelligence' = '"artificial general intelligence"',
    'hadron collider' = '"hadron collider"'
    )
    comparisons <- lapply(names(topics), function(label) {
    cmp <- scopus_compare_topics(
    reference_query = topics[[label]],
    comparison_terms = 'speculat*',
    years = years,
    field = 'TITLE-ABS-KEY'
    )
    cmp$topic <- label
    cmp
    })

    For every year, scopus_compare_topics() counts the records that match the reference query and those that also match the comparison term. The nine comparisons therefore take 846 requests to the Scopus API. Each row of the result holds a year, the count for the reference literature, the count for the comparison and the comparison as a percentage of the reference.

    library(dplyr)
    library(ggplot2)
    comparisons <- readRDS('searches/speculation_comparisons.rds')
    retrieved <- attr(comparisons, 'retrieved')
    retrieved
    #> [1] "2026-09-02 06:36 UTC"
    speculation <- bind_rows(comparisons) |>
    filter(query_type == 'comparison') |>
    transmute(topic, year, reference_n, n,
    percentage = comparison_percentage)
    head(speculation)
    #> # A tibble: 6 × 5
    #> topic year reference_n n percentage
    #> <chr> <int> <dbl> <dbl> <dbl>
    #> 1 language evolution 1980 5 0 0
    #> 2 language evolution 1981 4 0 0
    #> 3 language evolution 1982 4 0 0
    #> 4 language evolution 1983 1 0 0
    #> 5 language evolution 1984 5 0 0
    #> 6 language evolution 1985 6 0 0

    The searches were run on 2 September 2026, so the final year is incomplete and its share rests on fewer records than the years before it. Indexing also lags publication, so even a complete year keeps gaining records for some time after it ends.

    Results

    The nine literatures differ in size by orders of magnitude, and the size matters for reading the percentages. A share computed on a few dozen records moves by several points when one or two abstracts mention speculation, whereas a share computed on thousands of records barely moves at all.

    totals <- speculation |>
    group_by(topic) |>
    summarise(records = sum(reference_n), with_speculation = sum(n),
    share = 100 * with_speculation / records,
    first_year_with_records = min(year[reference_n > 0])) |>
    arrange(desc(share))
    totals
    #> # A tibble: 9 × 5
    #> topic records with_speculation share first_year_with_records
    #> <chr> <dbl> <dbl> <dbl> <int>
    #> 1 artificial general intelligence 1913 49 2.56 2006
    #> 2 language evolution 3376 48 1.42 1980
    #> 3 linguistic relativity 739 9 1.22 1980
    #> 4 bilingual advantage 637 4 0.628 1993
    #> 5 language comprehension 6543 24 0.367 1980
    #> 6 language disorders 14255 36 0.253 1980
    #> 7 language teaching 22957 42 0.183 1980
    #> 8 hadron collider 18457 20 0.108 1980
    #> 9 sensorimotor simulation 132 0 0 2003

    Across the whole period, the literature on artificial general intelligence has the highest share of records mentioning speculation, at 2.6%. The others run from 1.4% down to 0.0%, and neighbouring figures are not separated by the counts they rest on. The lowest belongs to sensorimotor simulation, whose 132 records are too few to place it anywhere in that order.

    Figure 1 sets those sizes side by side. Its axis is logarithmic, which is the only way the four orders of magnitude between the largest literature and the smallest fit on one panel.

    # Nine literatures against an eight-colour palette, so the Okabe-Ito set is
    # extended with one grey. Its yellow barely shows against the white background,
    # so it is replaced with a wine red, which also stays apart from the orange and
    # vermilion lines for colour-blind readers. Nine lines on one panel are hard to
    # tell apart by colour alone, so each line is named at its end, and the figure
    # that follows gives each literature its own panel.
    nine_colours <- c('#E69F00', '#56B4E9', '#009E73', '#882255', '#0072B2',
    '#D55E00', '#CC79A7', '#999999', '#000000')
    # Years without records are left empty, so that a line breaks there instead of
    # bridging the gap, and a year with no records on either side becomes a point.
    sizes <- speculation |>
    mutate(records = ifelse(reference_n > 0, reference_n, NA),
    isolated = reference_n > 0 & lag(reference_n, default = 0) == 0 &
    lead(reference_n, default = 0) == 0,
    .by = topic)
    ggplot(sizes, aes(year, records, colour = topic)) +
    geom_line(linewidth = 0.8) +
    geom_point(data = filter(sizes, isolated), size = 1.3) +
    # Each label sits at the last year with records, which need not be the
    # current year, since that year is still in progress. The labels take a
    # darker shade of each line's colour, which reads better as text, and the
    # seed fixes where ggrepel places them.
    ggrepel::geom_text_repel(
    aes(label = topic,
    colour = stage(topic, after_scale = colorspace::darken(colour, 0.25))),
    data = filter(sizes, !is.na(records)) |> filter(year == max(year), .by = topic),
    hjust = 0, direction = 'y', nudge_x = 1.5,
    xlim = c(max(sizes$year) + 1.5, Inf), size = 3.9,
    segment.size = 0.3, box.padding = 0.12, min.segment.length = 0, seed = 1) +
    scale_y_log10(labels = scales::label_comma()) +
    scale_colour_manual(values = nine_colours, guide = 'none') +
    coord_cartesian(clip = 'off') +
    labs(x = NULL, y = 'Records per year (log scale)') +
    theme_minimal(base_size = 13) +
    theme(plot.margin = margin(6, 145, 6, 6))

    Figure 1: Scopus Records per Year in Each of the Nine Reference Literatures. The axis is logarithmic, so equal vertical distances are equal ratios. A break in a line is a year in which that literature has no records.

    The Share of Records That Mention Speculation

    Each panel of Figure 2 shows one literature, and the panels are ordered by their overall share, from highest to lowest. The line is the yearly percentage of records that also match speculat*. The shaded band, drawn as a step for each year, is a 95% Wilson interval computed from the two yearly counts, and it shows how far the share would move with a handful of records. Every year with records carries one, so the band always surrounds the estimate it belongs to. The axis is cut at 15%, and where a year’s interval runs past that cut, as it does in the early years of several literatures and in most years of the smallest ones, the band is drawn up to the cut and a triangle at the top of the panel marks it. In the sparsest years, a single abstract would move the share by tens of points. The line itself runs off the top of its panel at the highest share in the data, the 33% that 1 of the 3 records on bilingual advantage in 2006 represent. Years in which a literature has no records break the line.

    wilson <- function(k, n, z = 1.96) {
    p <- k / n
    centre <- (p + z^2 / (2 * n)) / (1 + z^2 / n)
    half <- z * sqrt(p * (1 - p) / n + z^2 / (4 * n^2)) / (1 + z^2 / n)
    data.frame(lower = 100 * pmax(0, centre - half), upper = 100 * pmin(1, centre + half))
    }
    # Years with no records keep their row but carry NA, so that ggplot2 breaks the
    # line there instead of drawing a segment across a gap in the literature.
    panel_data <- speculation |>
    mutate(topic = factor(topic, levels = totals$topic)) |>
    bind_cols(wilson(speculation$n, speculation$reference_n)) |>
    mutate(across(c(percentage, lower, upper), ~ ifelse(reference_n > 0, .x, NA_real_)))
    panel_labels <- totals |>
    mutate(label = sprintf('%s\n%s records, %.1f%% with speculat*',
    topic, scales::label_comma()(records), share))
    labeller_topic <- setNames(panel_labels$label, panel_labels$topic)
    # The axis stops at 15%, and coord_cartesian below zooms rather than filters,
    # so every year with records keeps its band and a band that runs past the cut
    # is simply drawn up to it. A triangle at the top marks those years. Dropping
    # such bands instead, which is what this figure used to do, left the sparsest
    # years showing a point and no band at all, and a reader could reasonably take
    # that for a band and an estimate that disagreed. Each band is a step one year
    # wide, which keeps a single year visible between its two neighbours.
    y_limit <- 15
    ggplot(panel_data, aes(year, percentage)) +
    geom_rect(aes(xmin = year - 0.5, xmax = year + 0.5, ymin = lower, ymax = upper),
    data = filter(panel_data, !is.na(upper)),
    fill = '#0072B2', alpha = 0.17) +
    geom_point(aes(y = y_limit), data = filter(panel_data, upper > y_limit),
    shape = 17, size = 1.2, colour = '#80B3D8') +
    geom_line(colour = '#0072B2', linewidth = 0.7) +
    geom_point(colour = '#0072B2', size = 0.9) +
    facet_wrap(~ topic, ncol = 3, labeller = as_labeller(labeller_topic)) +
    scale_x_continuous(breaks = c(1980, 2000, 2020)) +
    scale_y_continuous(labels = scales::label_percent(scale = 1)) +
    coord_cartesian(ylim = c(0, y_limit)) +
    labs(x = NULL, y = 'Records mentioning speculation (%)') +
    theme_minimal(base_size = 13) +
    theme(axis.text = element_text(size = rel(0.85)),
    strip.text = element_text(size = rel(0.85), hjust = 0),
    panel.spacing = unit(1.2, 'lines'))

    Figure 2: The Yearly Percentage of Records That Also Match speculat*, One Panel per Literature, Ordered by Overall Share. The shaded band is a 95% Wilson interval for that year and a triangle marks a year whose interval runs past the 15% cut of the axis. Units: per cent of the records retrieved for that literature in that year.

    recent <- speculation |>
    filter(year >= 2016, year <= max(year) - 1) |>
    group_by(topic) |>
    summarise(records = sum(reference_n),
    share = 100 * sum(n) / sum(reference_n)) |>
    arrange(desc(share))
    recent
    #> # A tibble: 9 × 3
    #> topic records share
    #> <chr> <dbl> <dbl>
    #> 1 artificial general intelligence 1377 2.54
    #> 2 linguistic relativity 374 1.60
    #> 3 language evolution 1734 1.56
    #> 4 bilingual advantage 445 0.449
    #> 5 language comprehension 3298 0.334
    #> 6 language disorders 6511 0.230
    #> 7 language teaching 15193 0.178
    #> 8 hadron collider 7682 0.0781
    #> 9 sensorimotor simulation 88 0

    Restricting the comparison to the complete years from 2016 onwards, which leaves between 88 and 15,193 records per literature, gives the ranking above. The literature on artificial general intelligence still leads, with 2.5% of its records mentioning speculation. The 0.0% at the foot of the list again belongs to the smallest literature, sensorimotor simulation, at the bottom of that range.

    Discussion

    The measure is crude in at least three ways. First, a form of “speculate” in an abstract can be a mark of candour as much as of conjecture. Authors who write “we speculate that” are labelling a claim that others would present without a label, so a literature with a strong convention of hedged abstracts will score higher for that reason alone. Second, the wildcard catches “speculative” in senses that have nothing to do with scientific conjecture, such as speculative execution in computing or speculative investment in economics. Both senses can occur in the literatures on artificial general intelligence and on the hadron collider, whose funding is discussed in economic terms. Third, the queries define each literature by a phrase, so records that belong to a field without using its name are missed. The literatures on language teaching and language disorders, in particular, are far larger than their phrases suggest.

    The smallest literature, sensorimotor simulation, contains no record that mentions speculation. With 132 records over the whole period, that absence says more about the size of the literature than about its habits.

    With those limits in mind, the differences describe how the records retrieved by these particular queries are worded. The data are most useful as a transparent starting point for reading the records and revising the searches.

    References

    Bernabeu, P. (2026). scopusflow: A reproducible workflow layer for Scopus bibliographic searches (Version 0.4.0) [Computer software]. CRAN. https://doi.org/10.32614/CRAN.package.scopusflow

    Bernabeu, P., & Vogt, P. (2015, June 18). Language evolution: Current status and future directions [Paper presentation]. 10th Language at the University of Essex Postgraduate Conference (LangUE), Colchester, United Kingdom. https://eprints.lancs.ac.uk/id/eprint/130664/

    Société de Linguistique de Paris. (1866). Statuts de 1866. https://www.slp-paris.com/statuts1866.html

    To leave a comment for the author, please follow the link and comment on their blog: Pablo Bernabeu.

    R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
    Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
  • Exit mobile version