Dear Chris,
I have a large dataset of deer telemetry data with hourly positions and at least 22 GPS positions per day. My aim is to estimate the distance travelled (kilometres/ day) for each individual and day. This already worked once with a subset of the red deer dataset of nearly 200 000 GPS positions. When I try to do the same for the rest of the dataset, I Keep running into this error message: Error in if (CI[3] < UPPER) { : missing value where TRUE/FALSE needed, that apparently occurred in the Speed function.
With R Version 0.5.8 this error message already occurred on the eighth day of the first individual. I could not find any peculiarities in this part of dataset.
I changed the Version back to 0.5.6, with which it had already worked once for the above mentioned subset of the data, and the error message did not show up so early in the dataset, but it still occurred much later for a different individual and a different day.
This is the function I used first:
ctmm_speed_deer4_neu = function(GPS.df)
{
# breakdown to datasets per deer
id = unique(GPS.df$individual.local.identifier)
n1 = length(id)
GPS.ss = list()
GPS.r=list()
# This creates a date sequence at the desired sample interval
for (i in 1:n1){
id.df = GPS.df[GPS.df$individual.local.identifier== id[i],]
## this subsets data from one deer and date at a time
id2= unique(id.df$ID_date)
n_id=length(id2)
# all the dates within an ID
id.telemetry=as.telemetry(id.df,timeformat="",timezone="UTC", na.rm="row")
# make a telemetry object for each individual
#id.outlie=outlie(id.telemetry, plot=F)
#id.telemetry=id.telemetry[which(id.outlie$distance<8400 & id.outlie$speed<0.945),]
# remove outliers (identified by the histograms of the NPBW deer plus 5%)
GUESS.id.telemetry<-ctmm.guess(id.telemetry, interactive=FALSE)
FIT.id.telemetry<-ctmm.fit(id.telemetry,GUESS.id.telemetry)
for (j in 1:n_id){
id.date=id.df[id.df$ID_date==id2[j],]
id_date_telemetry=as.telemetry(id.date,timeformat="",timezone="UTC", na.rm="row")
Speeds.id.telemetry<-speed(id_date_telemetry, FIT.id.telemetry,level=0.95, cores=-1)
GPS.ss[[j]] = data.frame(Animal_ID=levels(droplevels(unique(id.date$individual.local.identifier))),
ID_date=levels(droplevels(unique(id.date$ID_date))),
Day_of_year=as.numeric(strftime(unique(id.date$date),format="%j")),
Speed_estimate=Speeds.id.telemetry,
Distance=sum(id.date$steplength)/1000,
Forest_density_mean=mean(id.date$Forest_density),
Elevation_mean=mean(id.date$Elevation),
Aspect_mean=mean(id.date$Aspect),
Slope_mean=mean(id.date$Slope),
Ruggedness_mean=mean(id.date$Ruggedness),
Hunting_perc=length(id.date$hunting[id.date$hunting=="Hunting"])/length(id.date$hunting)*100,
Cropland_seasonal_perc=length(id.date$habitat_type2[id.date$habitat_type2=="Cropland seasonal"])/length(id.date$habitat_type2)*100,
Forest_broadleaved_perc=length(id.date$habitat_type2[id.date$habitat_type2=="Forest broadleaved"])/length(id.date$habitat_type2)*100,
Forest_coniferous_perc=length(id.date$habitat_type2[id.date$habitat_type2=="Forest coniferous"])/length(id.date$habitat_type2)*100,
Forest_mixed_perc=length(id.date$habitat_type2[id.date$habitat_type2=="Forest mixed"])/length(id.date$habitat_type2)*100,
Shrubland_perc=length(id.date$habitat_type2[id.date$habitat_type2=="Shrubland"])/length(id.date$habitat_type2)*100,
Grassland_perc=length(id.date$habitat_type2[id.date$habitat_type2=="Grassland"])/length(id.date$habitat_type2)*100,
Barren_perc=length(id.date$habitat_type2[id.date$habitat_type2=="Barren"])/length(id.date$habitat_type2)*100,
Wetland_perc=length(id.date$habitat_type2[id.date$habitat_type2=="Wetland"])/length(id.date$habitat_type2)*100,
Datapoints=length(id.date$habitat_type2),
Temp=unique(id.date$T.mitt..0.24Uhr),
#NDVI_modis_mean=mean(id.date$NDVI),
#NDVI_season_mean=mean(id.date$NDVI_season),
#NDVI_2month_mean=mean(id.date$NDVI_2month),
Distance_path_mean=mean(id.date$Distance_paths),
Distance_roads_mean=mean(id.date$Distance_roads),
Distance_villages_mean=mean(id.date$Distance_villages))
}
GPS.r[[i]]= GPS.ss[[1]]
for(j in 2:n_id) {
GPS.r[[i]] = rbind(GPS.r[[i]], GPS.ss[[j]])}
}
GPS.t = GPS.r[[1]]
for(i in 2:n1) {
GPS.t= rbind(GPS.t, GPS.r[[i]])}
return(GPS.t)
}
ctmm_speed_deer4_neu = function(GPS.df)
{
# breakdown to datasets per deer
id = unique(GPS.df$individual.local.identifier)
n1 = length(id)
GPS.ss = list()
GPS.r=list()
# This creates a date sequence at the desired sample interval
for (i in 1:n1){
id.df = GPS.df[GPS.df$individual.local.identifier== id[i],]
## this subsets data from one deer and date at a time
id2= unique(id.df$ID_date)
n_id=length(id2)
# all the dates within an ID
id.telemetry=as.telemetry(id.df,timeformat="",timezone="UTC", na.rm="row")
# make a telemetry object for each individual
#id.outlie=outlie(id.telemetry, plot=F)
#id.telemetry=id.telemetry[which(id.outlie$distance<8400 & id.outlie$speed<0.945),]
# remove outliers (identified by the histograms of the NPBW deer plus 5%)
GUESS.id.telemetry<-ctmm.guess(id.telemetry, interactive=FALSE)
for (j in 1:n_id){
id.date=id.df[id.df$ID_date==id2[j],]
id_date_telemetry=as.telemetry(id.date,timeformat="",timezone="UTC", na.rm="row")
FIT.id.telemetry<-ctmm.fit(id_date_telemetry,GUESS.id.telemetry)
Speeds.id.telemetry<-speed(id_date_telemetry, FIT.id.telemetry,level=0.95, cores=-1)
GPS.ss[[j]] = data.frame(Animal_ID=levels(droplevels(unique(id.date$individual.local.identifier))),
ID_date=levels(droplevels(unique(id.date$ID_date))),
Day_of_year=as.numeric(strftime(unique(id.date$date),format="%j")),
Speed_estimate=Speeds.id.telemetry,
Distance=sum(id.date$steplength)/1000,
Forest_density_mean=mean(id.date$Forest_density),
Elevation_mean=mean(id.date$Elevation),
Aspect_mean=mean(id.date$Aspect),
Slope_mean=mean(id.date$Slope),
Ruggedness_mean=mean(id.date$Ruggedness),
Hunting_perc=length(id.date$hunting[id.date$hunting=="Hunting"])/length(id.date$hunting)*100,
Cropland_seasonal_perc=length(id.date$habitat_type2[id.date$habitat_type2=="Cropland seasonal"])/length(id.date$habitat_type2)*100,
Forest_broadleaved_perc=length(id.date$habitat_type2[id.date$habitat_type2=="Forest broadleaved"])/length(id.date$habitat_type2)*100,
Forest_coniferous_perc=length(id.date$habitat_type2[id.date$habitat_type2=="Forest coniferous"])/length(id.date$habitat_type2)*100,
Forest_mixed_perc=length(id.date$habitat_type2[id.date$habitat_type2=="Forest mixed"])/length(id.date$habitat_type2)*100,
Shrubland_perc=length(id.date$habitat_type2[id.date$habitat_type2=="Shrubland"])/length(id.date$habitat_type2)*100,
Grassland_perc=length(id.date$habitat_type2[id.date$habitat_type2=="Grassland"])/length(id.date$habitat_type2)*100,
Barren_perc=length(id.date$habitat_type2[id.date$habitat_type2=="Barren"])/length(id.date$habitat_type2)*100,
Wetland_perc=length(id.date$habitat_type2[id.date$habitat_type2=="Wetland"])/length(id.date$habitat_type2)*100,
Datapoints=length(id.date$habitat_type2),
Temp=unique(id.date$T.mitt..0.24Uhr),
#NDVI_modis_mean=mean(id.date$NDVI),
#NDVI_season_mean=mean(id.date$NDVI_season),
#NDVI_2month_mean=mean(id.date$NDVI_2month),
Distance_path_mean=mean(id.date$Distance_paths),
Distance_roads_mean=mean(id.date$Distance_roads),
Distance_villages_mean=mean(id.date$Distance_villages))
}
GPS.r[[i]]= GPS.ss[[1]]
for(j in 2:n_id) {
GPS.r[[i]] = rbind(GPS.r[[i]], GPS.ss[[j]])}
}
GPS.t = GPS.r[[1]]
for(i in 2:n1) {
GPS.t= rbind(GPS.t, GPS.r[[i]])}
return(GPS.t)
}
I also tried the older Version of the function with ctmm 0.5.8 and I still got the same error message, although again later in the dataset. For, now I am therefore all out of ideas...
Do you have any ideas or suggestions how to solve the issue?
Best,
Maik