Nothing
F.cjs.simulate <- function( super.p, super.s, fit, N1=1000, births.per.indiv="constant.popln", R=100 ){
# Generate R capture history matricies that follow the model in fit.
if( missing(super.p) | missing(super.s) ){
if( missing( fit ) ){
stop( "Either super.p and super.s must be specified, or fit must be specified")
}
super.p <- fit$p.hat
super.s <- fit$s.hat[,-ncol(fit$s.hat)]
# Set initial capture probability, which cannot be estimated by model in fit
# This makes initial population size equal to number of rows in p, i.e. M_t
super.p[,1] <- 1
} else {
# Make super.p and super.s matrices if they are vectors
if(!is.matrix(super.p)) super.p <- matrix(super.p, 1)
if(!is.matrix(super.s)) super.s <- matrix(super.s, 1)
if( any(is.na(super.p)) | any(is.na(super.s[,-ncol(super.s)])) ){
stop("NA's not allowed in super.p nor in all but final column of super.s")
}
# super.p must have one more column than super.s, but allow them to be specified with equal numbers of columns
# if same size, assume last super.s column is nonsense
if( ncol(super.p) == ncol(super.s) ){
super.s <- super.s[,-ncol(super.s)]
}
if( ncol(super.p) != (ncol(super.s) + 1) ){
stop("Number of columns in super.p must be one more than number of columns in super.s")
}
}
if( length(births.per.indiv) != ncol(super.s) & (births.per.indiv[1] != "constant.popln") ){
stop(paste("births.per.indiv vector must equal 'constant.popln', or length must equal", ncol(super.s)))
}
# Keeping nrows of super.p and super.s separate allows super p and super s to have different number of rows
N.super.p <- nrow(super.p)
N.super.s <- nrow(super.s)
ns <- ncol(super.p)
# Allocate space for answer
sim.hists <- vector("list", R)
# Main loops, I tried to do this with apply, but...
for( k in 1:R ){
popln <- matrix(1, N1, 1)
# Sample N1 from the super population for the initial realized population
super.samp <- sample( 1:N.super.p, N1, replace=TRUE )
p <- super.p[super.samp, ]
hists <- rbinom( N1, 1, p[,1] )
super.samp <- sample( 1:N.super.s, N1, replace=TRUE )
s <- super.s[super.samp, ]
for( j in 2:ns ){
alive <- popln[,j-1] == 1
survived <- captured <- rep(0,nrow(popln))
survived[alive] <- rbinom( sum(alive), 1, s[alive,j-1] )
captured[survived == 1] <- rbinom( sum(survived), 1, p[survived == 1,j] )
popln <- cbind( popln, survived )
hists <- cbind( hists, captured )
if( births.per.indiv[1] == "constant.popln" ){
births <- N1 - sum(survived)
} else {
# births.per.indiv is a vector of rates. Multiply by current number in population
births <- round(sum(survived) * births.per.indiv[j-1])
}
if( births > 0 ){
new.popln <- new.caps <- matrix(0, births, ncol(popln)) # ncol(popln) should equal j here
new.popln[,j] <- 1
super.samp <- sample(1:N.super.p, births, replace=TRUE)
new.p <- matrix(super.p[super.samp,], births, ns) # need the matrix(...) because births can = 1, in which case new.p would be vector and only 1 dimension.
new.caps[,j] <- rbinom( births, 1, new.p[,j] )
popln <- rbind(popln, new.popln)
hists <- rbind(hists, new.caps)
p <- rbind(p, new.p)
super.samp <- sample(1:N.super.s, births, replace=TRUE)
s <- rbind(s, super.s[super.samp,])
}
}
labs <- paste( "t", 1:ns, sep="" )
dimnames( hists ) <- list(NULL, labs)
dimnames( popln ) <- list(NULL, labs)
# Remove animals that were never captured
hists <- hists[ rowSums(hists) > 0, ]
# Wrap it up
sim.hists[[k]] <- list(hists=hists, popln.n=colSums(popln))
}
sim.hists
}
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.