How often do researchers say they speculate? Nine literatures compared

Abstract

This descriptive bibliometric analysis compares, across nine query-defined literatures, the annual share of Scopus records that mention speculat* in the title, abstract or keywords. The percentage is treated as an indicator of explicit wording in indexed records. It is no direct measure of evidential quality, theoretical progress or the amount of speculation in the full literature. The queries and data are available for inspection.

Some research topics invite more explicit conjecture than others. Language evolution invited it for long enough that a learned society of linguists 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 competing 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 key to the Scopus application programming interface (API). 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. The result has two rows per year, one for the reference query and one for the comparison. Each comparison row holds a year, the count for the reference literature, the count for the comparison and the comparison as a percentage of the reference. The code below keeps only those rows.

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 the counts they rest on are too small to separate neighbouring figures. 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, so that yearly counts more than three orders of magnitude apart 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))
Line chart on a logarithmic axis of the number of Scopus records per year in each of the nine reference literatures from 1980 onwards, with each line named at its end

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 widens as the number of records in a year shrinks. Every year with records carries one, so the band always surrounds the estimate it belongs to. The axis is cut at 15%. Where a year’s interval runs past that cut, the band is drawn up to the cut and a triangle at the top of the panel marks the year. This happens in the early years of several literatures and in most years of the smallest ones. 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 one of the three 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 would leave the sparsest years showing a point and no band
# at all, which a reader could reasonably take 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'))
Nine panels, one per literature, each showing the yearly percentage of Scopus records that mention speculation over the years in which that literature has records, with a shaded Wilson interval for each year and a triangle at the top of the panel wherever the interval runs past the 15% cut of the axis

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. Each percentage is out of all 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.

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]. Comprehensive R Archive Network (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 [Statutes of 1866]. https://www.slp-paris.com/statuts1866.html

R Markdown source of this post

Comments are provided by Disqus and are not loaded automatically. Loading them connects your browser to Disqus, which may use cookies and process data under its privacy policy. See this site's privacy notice for details.