By the end of this practical you should feel confident doing the following:
First need to load the requisite R libraries
## Loading required package: mrds
## This is mrds 2.2.2 ## Built: R 4.0.0; ; 2020-05-04 08:34:26 UTC; unix
## ## Attaching package: 'Distance'
## The following object is masked from 'package:mrds': ## ## create.bins
We can then load the data from the RData file (this needs to be in your R working directory):
Before setting off fitting detection functions, let’s look at the relationship of various variables in the data.
The most important covariate in a distance sampling analysis is distance itself. We can plot a histogram of the distances to check that (1) we imported the data correctly and (2) it conforms to the usual shape for line transect data.
hist(distdata$distance, xlab="Distance (m)", main="Distance to sperm whale observations")
We can also see how many observations were recorded per Beaufort level (some background on Beaufort with photos). We can first use
table() to see what values occur and how many there are:
## ## 0 1 1.8 2 2.4 2.5 2.7 2.8 2.9 3 3.1 3.5 3.6 3.7 3.9 4 4.5 5 ## 5 4 7 31 8 10 1 1 4 41 2 6 1 2 2 8 1 3
The survey protocol on these surveys took an average of several observers’ assessments of the weather, hence we get these decimal values. We can use the
breaks= argument to
hist() to bin these values to integer values. We’ll plot the values from the segments at the same time, so we can get an idea of what the conditions were like over the whole survey, not just when we saw sperm whales:
par(mfrow=c(1,2)) hist(distdata$Beaufort, breaks=seq(0, 5, by=1), main="Observations per Beaufort level", xlab="Beaufort") hist(segs$Beaufort, breaks=seq(0, 5, by=1), main="Segments per Beaufort level", xlab="Beaufort")
We can see here that most of the segments had a Beaufort >= 2 and very few had Beaufort of 0-1 (right plot). We can see then that there are few observations at the lowest Beaufort (left plot) because there just wasn’t much time to observe things in those conditions. We see that with increasing Beaufort observations fall off (right plot), even as there were plenty of segments with those higher Beaufort levels (right plot).
We can create a rounded version of the variable using the
cut function in R for later:
distdata$BeaufortCut <- cut(distdata$Beaufort, seq(0, 5, by=1), include.lowest=TRUE, ordered.result=TRUE)
Given we are including data from two different surveys we can also check that the surveys have similar histograms of distance (we’ll check with the detection function below whether we need to include a covariate to control for this).
par(mfrow=c(1,2)) hist(subset(distdata, Survey=="en04395")$distance, main="", ylim=c(0, 30), xlab="Distance (m)") hist(subset(distdata, Survey=="GU0403")$distance, main="", ylim=c(0, 30), xlab="Distance (m)")
It’s now time to fit some detection function models. We’ll use the
ds() function from the
Distance package to fit the detection function. You can access the help file for the
ds() function by typing
?ds – this will give you information about what the different arguments to the function are and what they do.
We can fit a very simple model with the following code:
df_hn <- ds(data=distdata, truncation=6000, key="hn", adjustment=NULL)
## Fitting half-normal key function
## Key only model: not constraining for monotonicity.
## AIC= 2252.06
## No survey area information supplied, only estimating detection function.
Let’s dissect the call and see what each argument means:
data=distdata: the data to use to fit the model, as we prepared above.
truncation=6000: set the truncation distance. Here, observations at distances greater than 6000m will be discarded before fitting the detection function.
key="hn": the key function to use for the detection function, in this case half-normal (
?dslists the other options).
adjustment=NULL: adjustment term series to fit.
NULLhere means that no adjustments should be fitted (again
?dslists all options).
Other useful arguments for this practical are:
formula=: gives the formula to use for the scale parameter. By default it takes the value
~1, meaning the scale parameter is constant and not a function of covariates.
order=: specifies the “order” of the adjustments to be used. This is a number (or vector of numbers) specifying the order of the terms. For example
order=2fits order 2 adjustments,
order=c(2,3)will fit a model with order 2 and 3 adjustments (mathematically, it only makes sense to include order 3 with order 2). By default the value is
ds()select the number of adjustments by AIC.
We can look at the summary of the fitted detection function using the
## ## Summary for distance analysis ## Number of observations : 132 ## Distance range : 0 - 6000 ## ## Model : Half-normal key function ## AIC : 2252.06 ## ## Detection function parameters ## Scale coefficient(s): ## estimate se ## (Intercept) 7.900732 0.07884776 ## ## Estimate SE CV ## Average p 0.5490484 0.03662569 0.06670757 ## N in covered region 240.4159539 21.32287580 0.08869160
Goodness of fit quantile-quantile plot and test results can be accessed using the
## ## Goodness of fit results for ddf object ## ## Distance sampling Cramer-von Mises test (unweighted) ## Test statistic = 0.396179 p-value = 0.0739475
We can plot the models simply using the