Sign in

James A Campbell

@rtbecard.bsky.social
1.8K followers 1K following 443 posts

(he/him) Former bird dude, current fish guy; currently based in Berlin. I'm into ecology, stats, bioacoustics, and artificial light. Currently working as part of this ETN: www.msca-ribes.eu

PostsRepliesMedia
Reposted by James A Campbell
Zack Labe @zacklabe.com · 25/09/2026
Quick oceans update: yah, sea surface temperatures remain in new territory this year. See more at zacklabe.com/climate-chan.... This data (extrapolar ocean) is provided by @copernicusecmwf.bsky.social ERA5. 🌊
Graph showing daily global mean sea surface temperatures for 2026. This is also compared to the daily data from the 1981-2010 average and 1991-2020 average. Annotations are also shown to the current year with the other years from 1940 to 2026. There is a seasonal cycle. There is a long-term warming trend. 2023 and 2024 are also indicated, which were the warmest years on record. Data is from ECMWF ERA5 reanalysis and updated through 23 September 2026.
2246113
Reposted by James A Campbell
Eamonn-Forde @eamonn-forde.bsky.social · 21/09/2026
Oh, Viz.
232248694
James A Campbell @rtbecard.bsky.social · 21/09/2026
New #citizenscience #ALAN paper out from my labmates.
nature.com
Citizen science reveals temporally structured insect attraction and mitigation efficacy under artificial light at night - Communications Biology
Communications Biology - Citizen science reveals temporally structured insect attraction and mitigation efficacy under artificial light at night
040
James A Campbell @rtbecard.bsky.social · 21/09/2026
@pfrazee.com what's the status of editing posts on here? Is this something that's on the roadmap? My accumulation of spelling mistakes is starting to become painful on here 😬.
020
James A Campbell @rtbecard.bsky.social · 21/09/2026
**Correction: "...time-difference-of-arrival positioning *error* in acoustic telemetry setups...."
000
James A Campbell @rtbecard.bsky.social · 21/09/2026
Its obviously AI, as both pre-prints are on ridiculously niche topics that I struggle to get others in my field interested in 🤣 and I got this messages within a day after the pre-prints went up. Also, there is an AI company called Primary that seems to deal in AI generated news 🙄.
Screen grab of the company "Primary" on linked in.  "Primary" describes itself as a AI-native news company, as sad as that sounds.
010
James A Campbell @rtbecard.bsky.social · 21/09/2026
Any one know what this is? For two recent pre-prints, I've gotten AI agents posing as "science journalists" emailing me for media requests. I'm wondering what the hustle is here.... Both times, the agent identified itself as "Conor Watkins" from "Primary News". #OpenScience #SciComm
Hi James, I am a science journalist writing about your new approach to tracking aquatic animal movement using acoustic telemetry arrays. I noticed you developed EK-TOA, a method combining time-of-arrival positioning with an extended Kalman filter, which offers faster and more accurate tracking than existing state-space models for long-term fish monitoring. I would appreciate the chance to ask a few brief questions by email. Would you be open to a short asynchronous interview? 

Conor Watkins
Senior Reporter
Primary News
111
James A Campbell @rtbecard.bsky.social · 20/09/2026
Absolute measures of time-difference-of-arrival positioning error in underwater acoustic telemetry setups
000
James A Campbell @rtbecard.bsky.social · 20/09/2026
An extended Kalman filter for large-volume path positioning of aquatic animals within acoustic telemetry arrays
100
James A Campbell @rtbecard.bsky.social · 20/09/2026
A population Monte Carlo model for underwater acoustic telemetry positioning in reflective environments
100
James A Campbell @rtbecard.bsky.social · 20/09/2026
Here's a thread of all my paper announcements:
101
James A Campbell @rtbecard.bsky.social · 20/09/2026
As usual, check the sup mat. Example R implementations of all the paper's math are shown there.
000
James A Campbell @rtbecard.bsky.social · 20/09/2026
Preprint: This short paper is my take on how to calculate/report absolute measures of time-difference-of-arrival positioning in #acoustictelemetry setups. Beyond reporting, these error measures can be passed to statespace models (like CTCRW) for very accurate post-processing estimates.
biorxiv.org
Absolute measures of time-difference-of-arrival positioning error in underwater acoustic telemetry setups
This brief communication presents two solutions for calculating absolute measures of error from time-difference-of-arrival (TDOA) positioning in underwater acoustic telemetry arrays. First, a Monte Ca...
233
James A Campbell @rtbecard.bsky.social · 20/09/2026
If interested, make sure to check sup mat. There are reproducible examples on how to apply the model to your own datasets.
000
James A Campbell @rtbecard.bsky.social · 20/09/2026
New preprint out: I use an extended Kalman filter for #acoustictelemetry positioning. It solves positions more-less instantly while applying a CTCRW movement model. It works great on datasets that don't have huge outliers (due to horizontal reflections).
biorxiv.org
An extended Kalman filter for large-volume path positioning of aquatic animals within acoustic telemetry arrays
Acoustic telemetry is a core methodology for collecting fine-scale movement data for aquatic animals. When telemetry receivers are set up in closely spaced arrays with overlapping detection ranges, th...
122
Reposted by James A Campbell
Ketan Joshi @ketanjoshi.co · 03/09/2026
fun fact! Musk's fossil fuelled data centres almost certainly emit more climate pollution than is saved by all Tesla vehicles ketanjoshi.co/2026/03/02/m...
Grok's fossil-fuelled data centres wipe out either a large chunk or more than all of Tesla's global avoided emissions
Fossil fuelled chatbot emissions
Avoided emissions from Tesla products
11
xAI data centres
32
2024 (Tesla report)
20
2023 (Tesla report)
13
2023 (Independent estimate, high)
10
2023 (Independent estimate, low)
...from its EVs, solar panels and batteries (depending on which year and calculation you use). All numbers in megatonnes of carbon dioxide equivalent per year
12225119
James A Campbell @rtbecard.bsky.social · 27/08/2026
I absolutely do not believe a human science journalist would be interested in my paper on: "Absolute measures of time-difference-of-arrival positioning error in underwater acoustic telemetry setups".🤣
010
James A Campbell @rtbecard.bsky.social · 27/08/2026
I suspect they are an AI agent scanning preprint repositories (I published on BioRxiv), then posing as journalists to make AI generated scientific news articles. The company "Primary" is an AI news organization founded by tech bro's as far as I can find.
110
James A Campbell @rtbecard.bsky.social · 27/08/2026
Has anyone been getting media requests from suspected AI agents for their papers? I published an *extremely* niche preprint... and my supervisor immediately got a media request email from a "journalist" from "Primary News". #SciComm #scisky
110
James A Campbell @rtbecard.bsky.social · 27/08/2026
(2/2) In the peer review history here, there was just a single anonymous reviewer, who opened by saying "I cannot review the main academic portion of this manuscript". The bar for "peer review" in this journal is really unacceptable... this is really shameful.
000
James A Campbell @rtbecard.bsky.social · 27/08/2026
(1/2) I have to speak up about this... I peer-reviewed this paper when it was rejected by Nature Sci. reports. It was, by far, the worst piece of scientific writing I have ever read.
100
James A Campbell @rtbecard.bsky.social · 27/08/2026
The authors used a fucking web article from pethelpful.com in their "literature review of national animal welfare regulations".
screenshot of the authors "literature review" which contains a printout of an article from pethelpful.comthe front page of pethelpful.com
000
James A Campbell @rtbecard.bsky.social · 27/08/2026
To sum it up... the peer preview process for this paper was a single anonymous peer reviewer who explicitly wrote in their review that they could not read/understand the research presented in the article. This is really not okay...
110
James A Campbell @rtbecard.bsky.social · 27/08/2026
This fucking paper even made it to the journals cover!? Please stop allowing anonymous peer review... There needs to be some level of accountability on how absolute shit gets through the peer review system.
100
James A Campbell @rtbecard.bsky.social · 27/08/2026
Here's what I wrote when I peer reviewed it in an earlier submission... My jaw is on the floor as to how this got accepted...
An excerpt from my reviewer comments:

Beyond the fundamental flaws in the papers premise, the quality of writing and crafting of this paper is extraordinarily poor. It is below the quality of what would be accepted as an assignment in a first-year undergraduate course. Briefly, the authors routinely used html links to news websites as references for animal welfare law (the most egregious being the pethelpful.com and mythbusters TV show reference); the authors somehow thought showing images of their cat (in a total of 21 figure panels!) was a suitable way to report the effects of refraction to the reader; the authors spent a significant portion of the main MS and supplementary material on a discussion of Adolf Hitler's perspectives on spherical aquaria and animal welfare law in Nazi Germany.
101
James A Campbell @rtbecard.bsky.social · 27/08/2026
It was submitted to Nature sci. reports and rejected (rightly so), then accepted this year to Proc. Royal Soc. There was just one peer reviewer who opened with: "I apologise that I cannot review the main academic portion of this manuscript - the maths and physics is too far out of my field."
101
James A Campbell @rtbecard.bsky.social · 27/08/2026
"Proceeding of the Royal society" is now officially on my list of absolutely shit journals... They published the worst paper I have every peer reviewed (and the worst piece of scientific writing I have ever read, by far).
112
James A Campbell @rtbecard.bsky.social · 16/08/2026
No question that there was disproportionate attention and obvious racial undertones in much of it... but there was also a serious story about standards and trust in higher education. Both these things can be true, making everything around this especially awful.
220
James A Campbell @rtbecard.bsky.social · 16/08/2026
I listened to the Guardian podcast where their reporter walked through all of the issues about him. There was a lot there, and it was really bad... it was much more than just exaggerating his CV. I'm not sure its fair to write all of it off as harassment.
320
James A Campbell @rtbecard.bsky.social · 06/08/2026
Note: It unfortunately must be compatible with MSOffice.
010
James A Campbell @rtbecard.bsky.social · 06/08/2026
What is the preferred (not latex or cloud-based) document format for collaboratively writing manuscripts across linux/windows/macOS? Specifically for equation compatibility. I'm using onlyoffice to write docx right now... seems to work... but I'm not sure how much I can trust it 🤔
110
Reposted by James A Campbell
All Our Yesterdays @allouryesterdays.bsky.social · 03/08/2026
Vol. 2, no. 5 of the CO2 Newsletter, June-August 1981 is now downloadable. Founded by American geologist William Barbat, each was 8 pages of excerpts from recent reports, editorials and deeply researched articles. All 18 issues are heart-breakers. allouryesterdays.info/co2-newslett... 1/9
CO2 Newsletter vol. 2 no 5 page 1
22213
James A Campbell @rtbecard.bsky.social · 22/07/2026
Nice! Exactly the kind of thing I was looking for!
010
James A Campbell @rtbecard.bsky.social · 22/07/2026
I'm starting to get worried that younger students reading papers will just assume that *everything* was made with some degree with AI assistance... so I'd like to explicitly state in my works that I don't mess with that.
010
James A Campbell @rtbecard.bsky.social · 22/07/2026
Are there examples of concise statements that people put in acknowledgments sections to make clear to readers that absolutely no AI was used in any part of their paper? #Academiclife
200
James A Campbell @rtbecard.bsky.social · 13/07/2026
See a detailed description here: rtbecard.gitlab.io/2026/07/13/R...
rtbecard.gitlab.io
Scaling figures in R Markdown
An options hook for automatically scaling R Markdown figures.
000
James A Campbell @rtbecard.bsky.social · 13/07/2026
I wrote up my solution for figure scaling in rmarkdown. `fig.width` and `fig.height` set the output size and the new `scale` parameter scales the figure contents. Paste the code for the option hook in the first chunk, and the scale parameter will be available in all the following chunks. #rstats
Plots with variable scale factors and constant size.

```{r, fig.width=2, fig.height=2}
plot(pressure)
```
```{r, fig.width=2, fig.height=2, scale = 0.5}
plot(pressure)
```Image of output from rmarkdown figure scaling example```{r setup, include=FALSE}
# Set chunk hook
# This will automatically adjust the figure parameters for you
knitr::opts_hooks$set(fig_scale = function(options) {
  
  # --- Store out_width
  # HTML and latex output require different units
  out_width <- switch(knitr::opts_knit$get("rmarkdown.pandoc.to"),
    # html requires pixels
    "html" = sprintf("%ipx", options[["fig.width"]] * options[["dpi"]]),
    # Latex requires inches
    "latex" = sprintf("%.fin", options[["fig.width"]])
  )
  
  # Calculate new fig width and height values
  fig_width <- options[["fig.width"]]/options[["scale"]]
  fig_height <- options[["fig.height"]]/options[["scale"]]
  
  # Store chunk options
  options$out.width = out_width
  options$fig.height = fig_height
  options$fig.width = fig_width
  # Return the modified options
  return(options)
})

# Set figure scaling hook for following chunks
knitr::opts_chunk$set(scale = 0.8, fig_scale = TRUE)
```
150
James A Campbell @rtbecard.bsky.social · 13/07/2026
Following up on this... I tried this in my own package, and it works wonderfully. Here, `last` is substituted for the length of the vector, and `fs` is the sample rate of the time series. Seems to work great, and its not clear to me if there is any problems that it might cause down the line.
Finally, indexing can be done with the special keywords fs and last. fs will be substituted fro the sample rate and last will give the final sample in the signal.
```{r}
# Extract last 0.5 seconds of data from the pressure channel
head(sig[(last-fs*0.5):last, "p"])
```
See ?Signal for a detailed overview with examples on how indexing works.
000
James A Campbell @rtbecard.bsky.social · 13/07/2026
Dear #rstats, is there a repository that shows the build scripts for all the libraries bundled in RTools distributions? I had an especially awful time trying to link to RTools' libsndfile (I gave up and compiled my own). Would be helpful if I could see how these libraries are configured.
000
James A Campbell @rtbecard.bsky.social · 29/06/2026
The concept seems to be a standard feature in other languages (Julia, Matlab, Python)... so I feel there must have already been discussions about this within the R developer community. The native pipe operator was (somewhat recently) introduced 4.1, so R still does get major features added.
000
James A Campbell @rtbecard.bsky.social · 29/06/2026
Interesting... I never thought of using pipes to make my indexing more compact.
000
James A Campbell @rtbecard.bsky.social · 29/06/2026
Another example where this is useful: Indexing a matrix with respect to the last columns, which cannot be done with tail.
010
James A Campbell @rtbecard.bsky.social · 29/06/2026
Also, for more complicated operations where you want to index from the last element, but are not necessarily interested in the last n values. Like `n <- length(vec); vec[(n-20):(n-10)]`.
010
James A Campbell @rtbecard.bsky.social · 29/06/2026
This doesn't really work for replacing elements though, right? Like `n=length(vec); vec[(n-10):n] <- 0`
330
James A Campbell @rtbecard.bsky.social · 29/06/2026
I feel on the user-side, this can be easily done with S3 classes to overload the indexing functions of vectors/lists, and just adding `substitute(..., env = list(end = length(x)))` before passing the object to `NextMethod`. Not clear to me why something like this doesn't already exist in base R.
110
James A Campbell @rtbecard.bsky.social · 29/06/2026
#rstats, is there a reason why R doesn't have a special `end` keyword for indexing? Like, `vec[(end-10):(end)]` for selecting the last 10 elements (as opposed to `n=length(vec); vec[(n-10):n]`). Or some reasonable way to refer to the last index? I feel like this is some low-hanging fruit
4111
James A Campbell @rtbecard.bsky.social · 27/06/2026
Note: The example code was done for a pdf output. I imagine HTML outputs will require different units for `out.width`, possibly "px"?
010
James A Campbell @rtbecard.bsky.social · 27/06/2026
Once the hook has been set (ideally in the first chunk), it will be executed in every following chunk. For each chunk it will: (i) read the provided `fig.width` and `fig.height` values; then (ii) generate new `fig.width`, `fig.height`, and `out.width` values based on the `scale` option.
100
James A Campbell @rtbecard.bsky.social · 27/06/2026
...quite happy with this... as it doesn't require manually modifying the options of every chunk in my rmd doc.
100
James A Campbell @rtbecard.bsky.social · 27/06/2026
I finally found a nice solution for scaling figures in rmarkdown: Setup a chunk options hook which dynamically sets the out.width, fig.width and fig.height options. fig.width=7, scale=0.8 now returns a figure 7 in wide, but the contents will be scaled down by a factor of 0.8. #Rstats
Screenshot of codeblock:

# Set chunk hook
# This will automatically adjust the figure parameters for you
knitr::opts_hooks$set(fig_scale = function(options) {
  # Calculate out_width
  out_width <- sprintf("%.fin", options[["fig.width"]])
  fig_width <- options[["fig.width"]]/options[["scale"]]
  fig_height <- options[["fig.height"]]/options[["scale"]]
  # Store chunk options
  options$out.width = out_width
  options$fig.height = fig_height
  options$fig.width = fig_width
  return(options)
})

# Set figure scaling hook
knitr::opts_chunk$set(scale = 0.8, fig_scale = TRUE)

# Set random seed for reproducible plots
set.seed(1)Example chunk where fig.width=7 and fig.height=5The resulting figure which has a width of 7 inches and the contents are scaled by a factor 0.8, so it matches well with rest of the document's text size.
142