The Rraven package is designed to facilitate the exchange of data between R and Raven sound analysis software (Cornell Lab of Ornithology). Raven provides very powerful tools for the analysis of (animal) sounds. R can simplify the automatization of complex routines of analyses. Furthermore, R packages as warbleR, seewave and monitoR (among others) provide additional methods of analysis, working as a perfect complement for those found in Raven. Hence, bridging these applications can largely expand the bioacoustician’s toolkit.

Currently, most analyses in Raven cannot be run in the background from a command terminal. Thus, most Rraven functions are design to simplify the exchange of data between the two programs, and in some cases, export files to Raven for further analysis. This vignette provides detailed examples for each function in Rraven, including both the R code as well as the additional steps in Raven required to fully accomplished the analyses. Raven Pro must be installed to be able to run some of the code. Note that the animations explaining these additional Raven steps are shown in more detail in the github version of this vignette, which can be downloaded as follows (saves the file “Rraven.hitgub.html” in your current working directory):

download.file(url = "https://github.com/maRce10/Rraven/raw/master/gifs/Rraven.hitgub.html", destfile = "Rraven.hitgub.html")

 

The downloaded file can be opened by any internet browser.

Before getting into the functions, the packages must be installed and loaded. I recommend using the latest developmental version, which is found in github. To do so, you need the R package devtools (which of course should be installed!). Some warbleR functions and example data sets will be used, so warbleR should be installed as well:

devtools::install_github("maRce10/warbleR")

devtools::install_github("maRce10/Rraven")

#from CRAN would be
#install.packages("warbleR")

#load packages
library(warbleR)
library(Rraven)

 

Let’s also use a temporary folder as the working directory i which to save all sound files and data files:

setwd(tempdir())

#load example data
data(list = c("Phae.long1", "Phae.long2", "Phae.long3", "Phae.long4", "selec.table", "selection_files"))

#save sound files  in temporary directory
writeWave(Phae.long1,"Phae.long1.wav")
writeWave(Phae.long2,"Phae.long2.wav")
writeWave(Phae.long3,"Phae.long3.wav")
writeWave(Phae.long4,"Phae.long4.wav")

#save Raven selection tables in the temporary directory
out <- lapply(1:4, function(x)
writeLines(selection_files[[x]], con = names(selection_files)[x]))

#this is the temporary directory location (of course different each time is run)
getwd() 

 


Importing data from Raven

imp_raven

This function imports Raven selection tables. Multiple files can be imported at once. Raven selection tables including data from multiple recordings can also be imported. It returns a single data frame with the information contained in the selection files. We already have 2 Raven selection tables in the working directory:

list.files(path = tempdir(), pattern = "\\.txt$")
[1] "LBH 1 selection table example.txt" "LBH 2 selection table example.txt" "LBH 3 selection table example.txt" "LBH 4 selection table example.txt"

 

This code shows how to import all the data contained in those files into R:

 #providing the name of the column with the sound file names
rvn.dat <- imp_raven(all.data = TRUE)

head(rvn.dat)
Selection View Channel Begin Time (s) End Time (s) Low Freq (Hz) High Freq (Hz) Begin File channel Begin Path File Offset (s) selec.file File Offset
1 Spectrogram 1 1 1.1693549 1.3423884 2220.105 8604.378 Phae.long1.wav 1 /tmp/RtmpWpOeaR/Phae.long1.wav 1.1693549 LBH 1 selection table example.txt NA
2 Spectrogram 1 1 2.1584085 2.3214565 2169.437 8807.053 Phae.long1.wav 1 /tmp/RtmpWpOeaR/Phae.long1.wav 2.1584085 LBH 1 selection table example.txt NA
3 Spectrogram 1 1 0.3433366 0.5182553 2218.294 8756.604 Phae.long1.wav 1 /tmp/RtmpWpOeaR/Phae.long1.wav 0.3433366 LBH 1 selection table example.txt NA
1 Spectrogram 1 1 0.1595983 0.2921692 2316.862 8822.316 Phae.long2.wav 1 /tmp/RtmpWpOeaR/Phae.long2.wav 0.1595983 LBH 2 selection table example.txt NA
2 Spectrogram 1 1 1.4570585 1.5832087 2284.006 8888.027 Phae.long2.wav 1 /tmp/RtmpWpOeaR/Phae.long2.wav 1.4570585 LBH 2 selection table example.txt NA
1 Spectrogram 1 1 0.6265520 0.7577715 3006.834 8822.316 Phae.long3.wav 1 /tmp/RtmpWpOeaR/Phae.long3.wav NA LBH 3 selection table example.txt 0.626552

 

Note that the ‘waveform’ view data has been removed. It can also be imported as follows (but note that the example selection tables have no waveform data):

rvn.dat <- imp_raven(all.data = TRUE, waveform = TRUE)

 

Raven selections can also be imported in a ‘selection.table’ format so it can be directly input into warbleR functions. To do this you need to set the all.data = FALSE and indicate which column contains the sound file name (using the ‘sound.file.col’ argument):

 #providing the name of the column with the sound file names
rvn.dat <- imp_raven(sound.file.col = "End.File", all.data = FALSE, freq.cols = TRUE)

head(rvn.dat)
sound.files channel.Channel channel.channel selec start end selec.file bottom.freq top.freq
Phae.long1.wav 1 1 1 1.1693549 1.3423884 LBH 1 selection table example.txt 2.220105 8.604378
Phae.long1.wav 1 1 2 2.1584085 2.3214565 LBH 1 selection table example.txt 2.169437 8.807053
Phae.long1.wav 1 1 3 0.3433366 0.5182553 LBH 1 selection table example.txt 2.218294 8.756604
Phae.long2.wav 1 1 1 0.1595983 0.2921692 LBH 2 selection table example.txt 2.316862 8.822316
Phae.long2.wav 1 1 2 1.4570585 1.5832087 LBH 2 selection table example.txt 2.284006 8.888027
Phae.long3.wav 1 1 1 0.6265520 0.7577715 LBH 3 selection table example.txt 3.006834 8.822316

 

The data frame contains the following columns: sound.files, channel, selec, start, end, and selec.file. You can also import the frequency range parameters in the ‘selection.table’ by setting ‘freq.cols’ tp TRUE. The data frame returned by “imp_raven” (when in the ‘warbleR’ format) can be input into several warbleR functions for further analysis. For instance, the following code runs additional parameter measurements on the imported selections:

# convert to class selection.table
rvn.dat.st <- make.selection.table(rvn.dat)

sp <- specan(X = rvn.dat, bp = "frange", wl = 150, pb = FALSE, ovlp = 90)

head(sp)
checking selections:
sound.files selec duration meanfreq sd freq.median freq.Q25 freq.Q75 freq.IQR time.median time.Q25 time.Q75 time.IQR skew kurt sp.ent time.ent entropy sfm meanfun minfun maxfun meandom mindom maxdom dfrange modindx startdom enddom dfslope meanpeakf bottom.freq top.freq
Phae.long1.wav 1 0.1730334 5.982350 1.399687 6.331716 5.296584 6.869521 1.572937 0.0764552 0.0465681 0.1174629 0.0708948 1.998039 7.021565 0.9434287 0.8869044 0.8367310 0.6510024 3.565944 1.2500000 7.5 6.403086 3.75 8.25 4.50 8.600000 6.90 7.50 3.467538 7.125 2.220105 8.604378
Phae.long1.wav 2 0.1630480 5.997299 1.422930 6.212125 5.328746 6.880795 1.552049 0.0766553 0.0439026 0.1156798 0.0717772 1.918356 7.334323 0.9468217 0.8885655 0.8413131 0.6678647 3.571200 0.4411765 7.5 6.638936 3.90 8.40 4.50 4.900000 6.75 7.20 2.759923 6.975 2.169437 8.807053
Phae.long1.wav 3 0.1749187 6.020600 1.515536 6.428439 5.152811 6.983309 1.830498 0.0902434 0.0534519 0.1277291 0.0742772 2.495361 11.139125 0.9450824 0.8866543 0.8379614 0.6715892 3.600466 1.1842105 7.5 6.495238 2.25 8.55 6.30 11.190476 8.40 7.20 -6.860328 7.125 2.218294 8.756604
Phae.long2.wav 1 0.1325709 6.398304 1.340412 6.595971 5.607323 7.380852 1.773529 0.0768669 0.0543005 0.1036645 0.0493641 1.568523 6.016392 0.9424661 0.8954798 0.8439594 0.6086184 6.161170 1.0714286 7.5 6.413764 4.80 7.95 3.15 11.142857 5.85 6.15 2.262940 7.425 2.316862 8.822316
Phae.long2.wav 2 0.1261502 6.311837 1.370040 6.602020 5.609829 7.213209 1.603380 0.0761028 0.0528492 0.0979471 0.0450980 2.468996 10.884349 0.9357710 0.8976772 0.8400203 0.6151042 5.774079 0.3040541 7.5 6.101143 3.00 7.65 4.65 9.580645 5.55 5.70 1.189059 6.675 2.284006 8.888027
Phae.long3.wav 1 0.1312195 6.612400 1.093120 6.670130 6.067212 7.349366 1.282153 0.0635054 0.0430425 0.0896131 0.0465706 1.773688 6.626019 0.9302440 0.8958878 0.8333942 0.5702146 6.830357 3.2142857 7.5 6.681285 4.80 8.10 3.30 11.045454 5.40 7.95 19.433083 6.675 3.006834 8.822316

 

And this code creates song catalogs:

catalog(X = rvn.dat.st[1:9, ], flim = c(1, 10), nrow = 3, ncol = 3, same.time.scale = F,
 ovlp = 90, parallel = 1, mar = 0.01, wl = 200, pal = reverse.heat.colors, width = 20,  labels = c("sound.files", "selec"), legend = 1, 
 tag.pal = list(terrain.colors), tags = "sound.files")

catalog

This is just to mention a few analysis that can be implemented in warbleR.

Rraven also contains the function imp_syrinx to import selections from Syrinx sound analyis software (although this program is not been maintained any longer).

extract_ts

The function extracts parameters encoded as time series in Raven selection tables. The resulting data frame can be directly input into functions for time series analysis of acoustic signals as in the warbleR function dfDTW. The function needs an R data frame, so the data should have been previously imported using imp_raven. This example uses the selection_file.ts example data that comes with Rraven:

#remove previous raven data files
unlink(list.files(pattern = "\\.txt$"))

#save Raven selection table in the temporary directory
writeLines(selection_files[[5]], con = names(selection_files)[5])

rvn.dat <- imp_raven(all.data = TRUE) 

# Peak freq contour dif length
fcts <- extract_ts(X = rvn.dat, ts.column = "Peak Freq Contour (Hz)")
 
head(fcts)
sound.files selec PFC..1 PFC..2 PFC..3 PFC..4 PFC..5 PFC..6 PFC..7 PFC..8 PFC..9 PFC..10 PFC..11 PFC..12 PFC..13 PFC..14 PFC..15 PFC..16 PFC..17 PFC..18 PFC..19 PFC..20 PFC..21 PFC..22 PFC..23 PFC..24 PFC..25 PFC..26 PFC..27 PFC..28 PFC..29 PFC..30 PFC..31 PFC..32 PFC..33 PFC..34 PFC..35 PFC..36 PFC..37 PFC..38 PFC..39 PFC..40 PFC..41 PFC..42 PFC..43 PFC..44 PFC..45 PFC..46 PFC..47 PFC..48 PFC..49 PFC..50 PFC..51
Phae.long1.wav 1 6943.4 7119.1 7294.9 7294.9 7294.9 7382.8 7470.7 7646.5 5185.5 5273.4 5361.3 5449.2 5449.2 5537.1 5537.1 5712.9 6416.0 6591.8 6591.8 5976.6 6503.9 5712.9 6416.0 6240.2 5976.6 6328.1 5185.5 5009.8 4658.2 4306.6 3955.1 7119.1 6855.5 6767.6 6767.6 6855.5 6943.4 7119.1 7207.0 7207.0 7207.0 7031.2 6943.4 6591.8 7119.1 7119.1 7207.0 7119.1 7207.0 7119.1 7119.1
Phae.long1.wav 2 6767.6 6943.4 7207.0 7207.0 7294.9 7382.8 7470.7 7558.6 7558.6 7646.5 5185.5 5361.3 5537.1 8261.7 8261.7 8349.6 5800.8 6152.3 6591.8 6679.7 5888.7 6416.0 5625.0 6152.3 5976.6 5976.6 5976.6 5273.4 5273.4 4570.3 4306.6 3867.2 7119.1 6855.5 6855.5 6855.5 6943.4 7119.1 7207.0 7207.0 7207.0 7207.0 7207.0 7119.1 7119.1 7207.0 7119.1 7207.0 NA NA NA
Phae.long1.wav 3 6943.4 4746.1 7119.1 4834.0 7207.0 4921.9 4921.9 7558.6 7646.5 7734.4 7998.0 8085.9 5449.2 8085.9 8349.6 7998.0 8701.2 6503.9 6591.8 5800.8 6503.9 6503.9 6328.1 6416.0 5449.2 6152.3 5361.3 5273.4 4921.9 4482.4 4130.9 3779.3 6943.4 6767.6 6767.6 6767.6 6943.4 7031.2 7119.1 7031.2 7294.9 7207.0 7207.0 7031.2 7207.0 7031.2 7031.2 7119.1 7119.1 7207.0 7119.1
Phae.long2.wav 4 5888.7 6503.9 4570.3 4834.0 5185.5 5537.1 5537.1 5800.8 6503.9 3779.3 6240.2 6328.1 6416.0 6591.8 5273.4 5712.9 4921.9 7382.8 6064.5 6767.6 7646.5 5800.8 7470.7 7294.9 7382.8 5537.1 6152.3 6416.0 5888.7 7558.6 7207.0 7294.9 6591.8 7822.3 7822.3 5976.6 6064.5 6152.3 6152.3 NA NA NA NA NA NA NA NA NA NA NA NA
Phae.long2.wav 5 4570.3 4746.1 4921.9 5097.7 5097.7 5185.5 5800.8 5712.9 5888.7 5976.6 6064.5 6064.5 4570.3 6855.5 6855.5 5976.6 6855.5 6679.7 6328.1 7646.5 5712.9 7207.0 6679.7 6591.8 6240.2 6855.5 6943.4 6416.0 6943.4 6591.8 6503.9 6416.0 7558.6 6591.8 5712.9 6591.8 5537.1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA
Phae.long3.wav 6 4218.8 6240.2 6591.8 6679.7 7119.1 5009.8 5800.8 6240.2 6767.6 6416.0 6328.1 6328.1 6503.9 6679.7 6591.8 5537.1 6679.7 6679.7 6591.8 6943.4 5976.6 6591.8 7119.1 6767.6 7470.7 6416.0 7470.7 6591.8 7998.0 7119.1 7910.2 7031.2 6943.4 7470.7 6943.4 7734.4 7119.1 7822.3 6416.0 6855.5 NA NA NA NA NA NA NA NA NA NA NA

 

Note that these sequences are not all of equal length (one has NAs at the end). extract_ts can also interpolate values so all time series have the same length:

# Peak freq contour equal length
fcts <- extract_ts(X = rvn.dat, ts.column = "Peak Freq Contour (Hz)",  equal.length = TRUE)

#look at the last rows wit no NAs
head(fcts)
sound.files selec PFC..1 PFC..2 PFC..3 PFC..4 PFC..5 PFC..6 PFC..7 PFC..8 PFC..9 PFC..10 PFC..11 PFC..12 PFC..13 PFC..14 PFC..15 PFC..16 PFC..17 PFC..18 PFC..19 PFC..20 PFC..21 PFC..22 PFC..23 PFC..24 PFC..25 PFC..26 PFC..27 PFC..28 PFC..29 PFC..30
Phae.long1.wav 1 3955.1 4082.390 4209.679 4336.969 4464.259 4591.548 4718.838 4846.128 4973.417 5100.707 5227.997 5355.286 5482.576 5609.866 5737.155 5864.445 5991.734 6119.024 6246.314 6373.603 6500.893 6628.183 6755.472 6882.762 7010.052 7137.341 7264.631 7391.921 7519.210 7646.5
Phae.long1.wav 2 3867.2 4021.766 4176.331 4330.897 4485.462 4640.028 4794.593 4949.159 5103.724 5258.290 5412.855 5567.421 5721.986 5876.552 6031.117 6185.683 6340.248 6494.814 6649.379 6803.945 6958.510 7113.076 7267.641 7422.207 7576.772 7731.338 7885.903 8040.469 8195.034 8349.6
Phae.long1.wav 3 3779.3 3949.021 4118.741 4288.462 4458.183 4627.903 4797.624 4967.345 5137.066 5306.786 5476.507 5646.228 5815.948 5985.669 6155.390 6325.110 6494.831 6664.552 6834.272 7003.993 7173.714 7343.434 7513.155 7682.876 7852.597 8022.317 8192.038 8361.759 8531.479 8701.2
Phae.long2.wav 4 3779.3 3918.714 4058.128 4197.541 4336.955 4476.369 4615.783 4755.197 4894.610 5034.024 5173.438 5312.852 5452.266 5591.679 5731.093 5870.507 6009.921 6149.334 6288.748 6428.162 6567.576 6706.990 6846.403 6985.817 7125.231 7264.645 7404.059 7543.472 7682.886 7822.3
Phae.long2.wav 5 4570.3 4676.376 4782.452 4888.528 4994.603 5100.679 5206.755 5312.831 5418.907 5524.983 5631.059 5737.134 5843.210 5949.286 6055.362 6161.438 6267.514 6373.590 6479.666 6585.741 6691.817 6797.893 6903.969 7010.045 7116.121 7222.197 7328.272 7434.348 7540.424 7646.5
Phae.long3.wav 6 4218.8 4349.117 4479.434 4609.752 4740.069 4870.386 5000.703 5131.021 5261.338 5391.655 5521.972 5652.290 5782.607 5912.924 6043.241 6173.559 6303.876 6434.193 6564.510 6694.828 6825.145 6955.462 7085.779 7216.097 7346.414 7476.731 7607.048 7737.366 7867.683 7998.0

 

And the length of the series can also be specified:

# Peak freq contour equal length 10 measurements
fcts <- extract_ts(X = rvn.dat, ts.column = "Peak Freq Contour (Hz)",
equal.length = T, length.out = 10)  

head(fcts)
sound.files selec PFC..1 PFC..2 PFC..3 PFC..4 PFC..5 PFC..6 PFC..7 PFC..8 PFC..9 PFC..10
Phae.long1.wav 1 3955.1 4365.256 4775.411 5185.567 5595.722 6005.878 6416.033 6826.189 7236.344 7646.5
Phae.long1.wav 2 3867.2 4365.244 4863.289 5361.333 5859.378 6357.422 6855.467 7353.511 7851.556 8349.6
Phae.long1.wav 3 3779.3 4326.178 4873.056 5419.933 5966.811 6513.689 7060.567 7607.444 8154.322 8701.2
Phae.long2.wav 4 3779.3 4228.522 4677.744 5126.967 5576.189 6025.411 6474.633 6923.856 7373.078 7822.3
Phae.long2.wav 5 4570.3 4912.100 5253.900 5595.700 5937.500 6279.300 6621.100 6962.900 7304.700 7646.5
Phae.long3.wav 6 4218.8 4638.711 5058.622 5478.533 5898.444 6318.356 6738.267 7158.178 7578.089 7998.0

 

The time series data frame can be directly input into the dfDTW warbleR function to calculate Dynamic Time Warping distances:

dfDTW(ts.df = fcts)

 

Phae.long1.wav-1 Phae.long1.wav-2 Phae.long1.wav-3 Phae.long2.wav-4 Phae.long2.wav-5 Phae.long3.wav-6 Phae.long3.wav-7 Phae.long3.wav-8 Phae.long4.wav-9 Phae.long4.wav-10 Phae.long4.wav-11
Phae.long1.wav-1 0.000 2665.922 3652.378 1777.533 2255.756 2402.544 3007.411 3251.644 4218.800 4609.500 4169.867
Phae.long1.wav-2 2665.922 0.000 2734.500 2744.233 3456.878 3027.333 3427.622 3896.578 3486.478 3583.922 3242.167
Phae.long1.wav-3 3652.378 2734.500 0.000 3515.600 4287.078 3340.089 3730.722 4423.944 3047.033 2773.678 3310.367
Phae.long2.wav-4 1777.533 2744.233 3515.600 0.000 3046.867 2783.167 3261.922 3818.556 3750.033 4179.911 3486.267
Phae.long2.wav-5 2255.756 3456.878 4287.078 3046.867 0.000 2539.122 2265.967 868.900 5244.222 5420.067 5722.533
Phae.long3.wav-6 2402.544 3027.333 3340.089 2783.167 2539.122 0.000 2060.578 2636.633 3613.667 4033.744 4619.300
Phae.long3.wav-7 3007.411 3427.622 3730.722 3261.922 2265.967 2060.578 0.000 2031.244 4609.611 5078.578 5751.878
Phae.long3.wav-8 3251.644 3896.578 4423.944 3818.556 868.900 2636.633 2031.244 0.000 5351.944 5645.189 6503.867
Phae.long4.wav-9 4218.800 3486.478 3047.033 3750.033 5244.222 3613.667 4609.611 5351.944 0.000 1758.000 4814.789
Phae.long4.wav-10 4609.500 3583.922 2773.678 4179.911 5420.067 4033.744 5078.578 5645.189 1758.000 0.000 3701.233
Phae.long4.wav-11 4169.867 3242.167 3310.367 3486.267 5722.533 4619.300 5751.878 6503.867 4814.789 3701.233 0.000

relabel_colms

This is a simple function to relabel columns so they match the selection table format used in warbleR:

#to simplify the example select a subset of the columns 
st1 <- rvn.dat[ ,1:7]

#check original column names
st1
# Relabel the basic columns required by warbleR
relabel_colms(st1)

 

Additional columns can also be relabeled:

# 2 additional column 
relabel_colms(st1, extra.cols.name = "View",
              extra.cols.new.name = "Raven view")
selec Raven view Channel start end bottom.freq top.freq
1 Spectrogram 1 1 1.169355 1.342388 2220.1 8604.4
2 Spectrogram 1 1 2.158408 2.321457 2169.4 8807.1
3 Spectrogram 1 1 0.343337 0.518255 2218.3 8756.6
4 Spectrogram 1 1 2.659643 2.792214 2316.9 8822.3
5 Spectrogram 1 1 3.957103 4.083253 2284.0 8888.0
6 Spectrogram 1 1 4.826641 4.957860 3006.8 8822.3
7 Spectrogram 1 1 6.174302 6.304481 2776.8 8888.0
8 Spectrogram 1 1 4.323453 4.454670 2316.9 9315.2
9 Spectrogram 1 1 7.916900 8.062325 2514.0 9216.6
10 Spectrogram 1 1 9.332781 9.476967 2579.7 10235.1
11 Spectrogram 1 1 6.545487 6.690585 2579.7 9742.3

 


imp_corr_mat

The function imports the output of a batch correlation routine in Raven. Both the correlation and lag matrices contained in the output ‘.txt’ file are read and both waveform and spectrogram (cross-correlation) correlations can be imported.

This example shows how to input the sound files into Raven and how to bring the results back to R. First, the selections need to be cut as single sound files for the Raven correlator to be able to read it. We can do this using the cut_sels function from warbleR:

#create new folder to put cuts
dir.create("cuts")

# add a rowname column to be able to match cuts and selections
selec.table$rownames <- sprintf("%02d",1:nrow(selec.table))

# cut files
cut_sels(X = selec.table, mar = 0.05, path = tempdir(), dest.path = file.path(tempdir(), "cuts"), labels = c("rownames", "sound.files", "selec"), pb = FALSE)

#list cuts
list.files(path = file.path(tempdir(), "cuts"))

 

Every selection is in its own sound file (labeled as paste("rownames", "sound.files", "selec")). Now open Raven and run the batch correlator on the ‘cuts’ folder as follows:

gif1  

And then import the output file into R:

# Import output (change the name of the file if you used a different one)
xcorr.rav <- imp_corr_mat(file = "BatchCorrOutput.txt", path = tempdir())

 

The function returns a list containing the correlation matrix:

xcorr.rav$correlation

 

01-Phae.long1-1.wav 10-Phae.long4-2.wav 11-Phae.long4-3.wav 07-Phae.long3-2.wav 05-Phae.long2-2.wav 09-Phae.long4-1.wav 04-Phae.long2-1.wav 02-Phae.long1-2.wav 06-Phae.long3-1.wav 03-Phae.long1-3.wav 08-Phae.long3-3.wav
01-Phae.long1-1.wav 1.000 0.216 0.184 0.285 0.443 0.195 0.145 0.613 0.360 0.812 0.236
10-Phae.long4-2.wav 0.216 1.000 0.781 0.290 0.235 0.907 0.289 0.176 0.204 0.209 0.323
11-Phae.long4-3.wav 0.184 0.781 1.000 0.279 0.186 0.804 0.274 0.127 0.189 0.185 0.393
07-Phae.long3-2.wav 0.285 0.290 0.279 1.000 0.433 0.281 0.270 0.251 0.635 0.274 0.496
05-Phae.long2-2.wav 0.443 0.235 0.186 0.433 1.000 0.197 0.243 0.449 0.397 0.363 0.304
09-Phae.long4-1.wav 0.195 0.907 0.804 0.281 0.197 1.000 0.310 0.164 0.199 0.214 0.322
04-Phae.long2-1.wav 0.145 0.289 0.274 0.270 0.243 0.310 1.000 0.151 0.302 0.182 0.256
02-Phae.long1-2.wav 0.613 0.176 0.127 0.251 0.449 0.164 0.151 1.000 0.264 0.448 0.200
06-Phae.long3-1.wav 0.360 0.204 0.189 0.635 0.397 0.199 0.302 0.264 1.000 0.318 0.377
03-Phae.long1-3.wav 0.812 0.209 0.185 0.274 0.363 0.214 0.182 0.448 0.318 1.000 0.227
08-Phae.long3-3.wav 0.236 0.323 0.393 0.496 0.304 0.322 0.256 0.200 0.377 0.227 1.000

 

and the time lag matrix:

xcorr.rav$`lag (s)`

 

01-Phae.long1-1.wav 10-Phae.long4-2.wav 11-Phae.long4-3.wav 07-Phae.long3-2.wav 05-Phae.long2-2.wav 09-Phae.long4-1.wav 04-Phae.long2-1.wav 02-Phae.long1-2.wav 06-Phae.long3-1.wav 03-Phae.long1-3.wav 08-Phae.long3-3.wav
01-Phae.long1-1.wav 0.000 0.011 0.006 0.028 0.034 0.006 0.023 0.000 0.023 -0.006 0.023
10-Phae.long4-2.wav -0.011 0.000 -0.006 0.040 0.023 -0.006 -0.028 -0.017 0.040 -0.017 0.057
11-Phae.long4-3.wav -0.006 0.006 0.000 0.046 0.028 0.000 -0.023 -0.074 0.046 -0.011 0.063
07-Phae.long3-2.wav -0.028 -0.040 -0.046 0.000 -0.011 -0.046 -0.023 -0.034 0.000 -0.028 0.017
05-Phae.long2-2.wav -0.034 -0.023 -0.028 0.011 0.000 -0.028 0.017 -0.028 0.023 -0.040 0.006
09-Phae.long4-1.wav -0.006 0.006 0.000 0.046 0.028 0.000 -0.023 0.034 0.046 -0.011 0.063
04-Phae.long2-1.wav -0.023 0.028 0.023 0.023 -0.017 0.023 0.000 -0.057 0.057 -0.051 0.017
02-Phae.long1-2.wav 0.000 0.017 0.074 0.034 0.028 -0.034 0.057 0.000 0.040 0.000 0.023
06-Phae.long3-1.wav -0.023 -0.040 -0.046 0.000 -0.023 -0.046 -0.057 -0.040 0.000 -0.028 0.000
03-Phae.long1-3.wav 0.006 0.017 0.011 0.028 0.040 0.011 0.051 0.000 0.028 0.000 0.023
08-Phae.long3-3.wav -0.023 -0.057 -0.063 -0.017 -0.006 -0.063 -0.017 -0.023 0.000 -0.023 0.000

 

This output is ready for stats. For instance, the following code runs a mantel test between cross-correlation (converted to distances) and warbleR spectral parameter pairwise dissimilarities:

#convert cross-corr to distance
xcorr.rvn <- 1- xcorr.rav$correlation

#sort matrix to match selection table
xcorr.rvn <- xcorr.rvn[order(rownames(xcorr.rvn)), order(colnames(xcorr.rvn))]

#convert it to distance matrix
xcorr.rvn <- as.dist(xcorr.rvn)

# measure acoustic parameters
sp.wrblR <- specan(selec.table, bp = c(1, 11), wl = 150, pb = FALSE)

#convert them to distance matrix
dist.sp.wrblR <- dist(sp.wrblR)

vegan::mantel(xcorr.rvn, dist.sp.wrblR)

Mantel statistic based on Pearson's product-moment correlation 

Call:
vegan::mantel(xdis = xcorr.rvn, ydis = dist.sp.wrblR) 

Mantel statistic r: 0.284 
      Significance: 0.016 

Upper quantiles of permutations (null model):
  90%   95% 97.5%   99% 
0.161 0.209 0.254 0.325 
Permutation: free
Number of permutations: 999

 

There is actually a good match between the two methods!


Exporting R data to Raven

exp_raven

exp_raven saves a selection table in ‘.txt’ format that can be directly opened in Raven. No objects are returned into the R environment. The following code exports a data table from a single sound file:

# Select data for a single sound file
st1 <- selec.table[selec.table$sound.files == "Phae.long1.wav",]

# Export data of a single sound file
exp_raven(st1, file.name = "Phaethornis 1", khz.to.hz = TRUE)

 

If the path to the sound file is provided, the functions exports a ‘sound selection table’ which can be directly open by Raven (and which will also open the associated sound file):

# Select data for a single sound file
st1 <- selec.table[selec.table$sound.files == "Phae.long1.wav",]

# Export data of a single sound file
exp_raven(st1, file.name = "Phaethornis 1", khz.to.hz = TRUE, sound.file.path = tempdir())

gif2  

This is useful to add new selections or even new measurements:

gif3  

If several sound files are available, users can either export them as a single selection file or as multiple selection files (one for each sound file). This example creates a multiple sound file selection:

exp_raven(X = selec.table, file.name = "Phaethornis multiple sound files", 
sound.file.path = tempdir(), single.file = TRUE)

 

These type of tables can be opened as a multiple file display in Raven:

gif4  


Running Raven from R

run_raven

The function opens multiple sound files simultaneously in Raven. When the analysis is finished (and the Raven window is closed) the data can be automatically imported back into R using the ‘import’ argument. Note that Raven, unlike R, can also handle files in ‘mp3’, ‘flac’ and ‘aif’ format .

# here replace with the path where Raven is install in your computer
raven.path <- "PATH_TO_RAVEN_DIRECTORY_HERE" 

# run function 
run_raven(raven.path = raven.path, sound.files = c("Phae.long1.wav", "Phae.long2.wav", "Phae.long3.wav", "Phae.long4.wav"), import = TRUE, 
 all.data = TRUE)  

gif5  

See imp_raven above for more details on additional settings when importing selections.


raven_batch_detec

As the name suggests, raven_batch_detec runs Raven detector on multiple sound files (sequentially). Batch detection in Raven can also take files in ‘mp3’, ‘flac’ and ‘aif’ format (although this could not be further analyzed in R!).

This is example runs the detector on one of the example sound files that comes by default with Raven:

detec.res <- raven_batch_detec(raven.path = raven.path, 
sound.files = "BlackCappedVireo.aif", path = file.path(raven.path, "Examples"))

gif6  


Please report any bugs here. The Rraven package should be cited as follows:

Araya-Salas, M. (2017), Rraven: connecting R and Raven bioacoustic software. R package version 1.0.0.


Session information

R version 3.4.4 (2018-03-15)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.4 LTS

Matrix products: default
BLAS: /usr/lib/openblas-base/libblas.so.3
LAPACK: /usr/lib/libopenblasp-r0.2.18.so

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=C               LC_MONETARY=en_US.UTF-8   
 [6] LC_MESSAGES=en_US.UTF-8    LC_PAPER=en_US.UTF-8       LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] kableExtra_0.7.0   knitr_1.20         Rraven_1.0.3       warbleR_1.1.13     NatureSounds_1.0.0 seewave_2.1.0      tuneR_1.3.2       
[8] maps_3.3.0        

loaded via a namespace (and not attached):
 [1] pbapply_1.3-4        lattice_0.20-35      colorspace_1.3-2     htmltools_0.3.6      viridisLite_0.2.0    mgcv_1.8-23         
 [7] yaml_2.1.16          rlang_0.1.6          pracma_2.1.4         pillar_1.0.1         glue_1.2.0           bindrcpp_0.2        
[13] jpeg_0.1-8           bindr_0.1            plyr_1.8.4           stringr_1.2.0        munsell_0.4.3        rvest_0.3.2         
[19] evaluate_0.10.1      permute_0.9-4        fftw_1.0-4           parallel_3.4.4       highr_0.6            Rcpp_0.12.14        
[25] readr_1.1.1          backports_1.1.2      scales_0.5.0         vegan_2.4-6          scatterplot3d_0.3-40 Sim.DiffProc_4.0    
[31] Deriv_3.8.4          rjson_0.2.18         hms_0.4.0            digest_0.6.13        stringi_1.1.6        dplyr_0.7.4         
[37] grid_3.4.4           dtw_1.18-1           rprojroot_1.3-2      tools_3.4.4          bitops_1.0-6         magrittr_1.5        
[43] rgl_0.95.1441        RCurl_1.95-4.10      proxy_0.4-22         tibble_1.4.1         cluster_2.0.7-1      pkgconfig_2.0.1     
[49] Matrix_1.2-14        MASS_7.3-49          xml2_1.2.0           assertthat_0.2.0     rmarkdown_1.8        httr_1.3.1          
[55] iterators_1.0.9      R6_2.2.2             nlme_3.1-137         signal_0.7-6         compiler_3.4.4