Dear Steve,

I am exploring the trajectory analysis functions of the new adehabitatLT package and am coming across an error while I am trying to partition the trajectory using the function partmod.ltraj. Unfortunately I do not get the error on all data sets that I am working on, which is making it very difficult for me to track down exactly what the cause is. The error is "Error in if (prot > 1e-08) { : missing value where TRUE/FALSE needed"

As an example, the code below shows the process for one particular data set, the first completes successfully, while the second results in the above error:

# Example 1
tested.means <- round(seq(0,20000, length=10),0)
limod <- as.list(paste("dnorm(dist, mean=", tested.means, ", sd=750)"))
(mod <- modpartltraj(tr3, limod))
bestpartmod(mod)
(pm <- partmod.ltraj(tr3,14, mod))

# Example 2
tested.means <- round(seq(0,15000, length=10),0)
limod <- as.list(paste("dnorm(dist, mean=", tested.means, ", sd=750)"))
(mod <- modpartltraj(tr3, limod))
bestpartmod(mod)
(pm <- partmod.ltraj(tr3,8, mod))

In the second example, I have only changed the upper bound of the set of models. As a result, the recommended number of partitions (bestpartmod) changes to 8, which I use to create 'pm' but the above error is the result. If I continue to reduce the number of partitions, it's finally successful at 3. Alternatively, if I reduce the upper bound of the model from 20000 to 16000 and also reduce the number of models from 10 to 8, it will also run successfully.

This is indeed a bug that occurs in partmod.ltraj when missing values occur in the trajectory and na.manage="prop.move". It is now corrected. Until I submit a revised version (probably by the end of the week), you can use this corrected version of partmod.ltraj:

partmod.ltraj <- function (tr, npart, mods, na.manage = c("prop.move", "locf"))
{
    if (!inherits(tr, "ltraj"))
        stop("tr should be of class \"ltraj\"")
    if (length(tr) > 1)
        stop("only one traject can be passed")
    if (!inherits(mods, "modpartltraj"))
        stop("mods should be of class modpartltraj")
    na.manage <- match.arg(na.manage)
    cor <- tr[[1]]
    indiceNA <- attr(mods, "nna.places")
    if (npart > nrow(mods))
        stop("too large number of segments required")
    toto <- .C("partrajr", as.double(t(as.matrix(mods))), double(npart),
        integer(npart), integer(npart + 1), as.integer(nrow(mods)),
as.integer(ncol(mods)), as.integer(npart), PACKAGE = "adehabitatLT")
    curloc <- rev(toto[[4]])
    curloc[2:length(curloc)] <- curloc[2:length(curloc)] + 1
    curmod <- rev(toto[[3]])
    curma <- rev(toto[[2]])
    filo <- curloc[-length(curloc)]
    lalo <- curloc[-1]
    lalo[length(lalo)] <- nrow(cor)
    resltr <- lapply(1:length(lalo), function(i) {
        if (i == 1) {
            xyt <- cor[1:indiceNA[lalo[i]], c("x", "y", "date")]
        }
        else {
            if (i == length(lalo)) {
                xyt <- cor[indiceNA[filo[i]]:nrow(cor), c("x",
                  "y", "date")]
            }
            else {
                xyt <- cor[indiceNA[filo[i]]:indiceNA[lalo[i]],
                  c("x", "y", "date")]
            }
        }
        return(as.ltraj(xyt[, c("x", "y")], xyt[, c("date")],
            id = id(tr), burst = i))
    })
    cseq <- function(x) {
        id <- diff(c(1, c(1:length(x))[abs(c(0, diff(x))) > 0],
            length(x) + 1))
        split(x, unlist(sapply(1:length(id), function(i) rep(i,
            id[i]))))
    }
    if (na.manage == "prop.move") {
        nadf <- do.call("rbind", lapply(1:length(resltr), function(i) {
            nas <- is.na(resltr[[i]][[1]]$dist[-nrow(resltr[[i]][[1]])])
            vec <- cseq(nas)
            beg <- sum(vec[[length(vec)]])
            intern <- sum(nas) - beg
            return(c(beg, intern))
        }))
        nadf <- as.data.frame(nadf)
        typmod <- tapply(nadf[, 2], factor(curmod), sum)
        typmod <- typmod/sum(typmod)
        for (i in 2:length(resltr)) {
            gg <- resltr[[i - 1]][[1]]
            gg2 <- resltr[[i]][[1]]
            gg <- gg[-nrow(gg), ]
            ff <- cseq(is.na(gg$dist))
            nna <- sum(ff[[length(ff)]])
            if (nna > 1) {
prot <- sum(typmod[names(typmod)%in%c(curmod[i - 1], curmod[i])])
                if (prot > 1e-08) {
nna1 <- floor(nna * typmod[names(typmod)==curmod[i - 1]]/prot)
                }
                else {
                  nna1 <- floor(nna/2)
                }
                nna2 <- nna - nna1
                gg2 <- rbind(gg[(nrow(gg) - nna2):nrow(gg), ],
                  gg2)
                gg <- gg[1:(nrow(gg) - nna2), ]
                resltr[[i - 1]] <- as.ltraj(gg[, c("x", "y")],
                  gg[, c("date")], id = id(tr), burst = i - 1)
                resltr[[i]] <- as.ltraj(gg2[, c("x", "y")], gg2[,
                  c("date")], id = id(tr), burst = i)
            }
        }
    }
    resltr <- do.call("c.ltraj", resltr)
    resu <- list(ltraj = resltr, stats = list(locs = curloc,
        Mk = curma, mod = curmod, which.mod = colnames(mods)[curmod]))
    attr(resu, "nna.places") <- indiceNA
    class(resu) <- "partltraj"
    return(resu)
}


Thanks for reporting,
Best regards,


Clément Calenge.








If anyone has any experience with this or thoughts that might help, I would appreciate hearing from you.

Thanks in advance
Steve


_______________________________________________
AniMov mailing list
AniMov@faunalia.it
http://lists.faunalia.it/cgi-bin/mailman/listinfo/animov


--
Clément CALENGE
Cellule d'appui à l'analyse de données
Direction des Etudes et de la Recherche
Office national de la chasse et de la faune sauvage
Saint Benoist - 78610 Auffargis
tel. (33) 01.30.46.54.14

_______________________________________________
AniMov mailing list
AniMov@faunalia.it
http://lists.faunalia.it/cgi-bin/mailman/listinfo/animov

Reply via email to