[R-es] Corregir mismo ID para individuos diferentes en una serie temporal

Ruben Bermad ruben_bm en hotmail.com
Lun Ene 25 18:11:28 CET 2016


Hola a todos, 
Quería preguntar si alguno sabe como puedo identificar registros con un mismo ID en el tiempo, pero que hacer referencia a objetos o individuos diferentes. 
En mi caso en particular estoy estudiando un animal que tiene una vida media cercana 2 años, y tengo una serie longitudinal de 25 años. El problema es que durante el muestreo en algunos casos durante la recoleccion de los datos, se repitieron los nombres de los individuos porque se asumen que si ha pasado 10 años no puede ser el mismo individuo. Y el problema que yo tengo es que no se como detectar de manera automática este tipo de errores. 
Había pensado era en registrar la primera aparición de cada nombre (e.g indiv_1, y ver el tiempo que ha pasado en comparación con el resto de registros para ese mismo individuo, y en el caso que fuera superior (por ejemplo a 36 meses para estar totalmente seguros), que ese individuo que había sido registrado como "indiv_1" sea renombrado (e.g. indiv_150), y cambiar todos los siguientes registros de indiv_1 a indiv_150. 
Esto parece sencillo, pero lo complicado al revisar todos los casos nombrados ahora como indiv_150 ya que es posible que el nombre indiv_1 haya sido usado para varios individuos diferentes a lo largo de la serie (e.g. en el año 1, 10 y 20). Entonces lo que había pensado es hacer un bucle para cada individuo, pero no consigo que cada vez que cambia el nombre de un individuo (e.g. en el año 10) capture la nueva fecha para determinar si los siguientes nombres hacen referencia al mismo individuo u a otro muy posterior en el tiempo (e.g. año 20). 
Esta pregunta la pregunte hace tiempo en stackoverflowhttp://stackoverflow.com/questions/32310520/identify-objects-with-repeated-measures-and-with-the-same-id-between-years, pero no obtuve una respuesta que solucionara el problema, y los posteriores intentos que he estado haciendo tampoco han sido muy buenos que se digan (os lo copio al final del mensaje). 
Por ello os quería preguntar si alguno sabe como puedo ir registrando y cambiando los IDs a lo largo del tiempo. 
Muchas gracias por adelantado, Un cordial saludo, Rubén
Codigo usadodatabase es la base de datos con la serie temporalID_original es el identificado original que tiene cada individuoMonth_Capt es la variable que me indica en que momento fue capturado cada individuo y por tanto si es posible o no que el individuo sea el mismo a lo largo del tiempo.
newID <-sapply(unique(database$ID_original), function(x) c(0,cumsum(diff(database$Month_Capt[database$ID_original==x]))%%48))names(newID)<-(unique(database$ID_original))
new_df<-data.frame(database$ID_original,database$Month_Capt,IDcond=NA,new_ID=NA)for(i in unique(database$ID_original)){  new_df[new_df[,1]==i,3]<-newID[[which(unique(database$ID_original)==i)]]}ltrs<-c(LETTERS,apply(combn(LETTERS,2,simplify = T),2,function(x) paste(x,sep = "",collapse = "")))
letterwrap <- function(n, depth = 1) {  args <- lapply(1:depth, FUN = function(x) return(LETTERS))  x <- do.call(expand.grid, args = list(args, stringsAsFactors = F))  x <- x[, rev(names(x)), drop = F]  x <- do.call(paste0, x)  if (n <= length(x)) return(x[1:n])  return(c(x, letterwrap(n - length(x), depth = depth + 1)))}
ltrs <- letterwrap(nrow(database)) # Create as many letters as unique IDs

ltrn<-0for(i in 1:nrow(new_df)){  if(new_df[i,3]==0) {ltrn<-ltrn+1;new_df[i,4]<-ltrs[ltrn]}  else {ind<-which(new_df[,1]==new_df[i,1])        ind<-ind[ind<i]        new_df[i,4]<-tail(new_df[ind,4],1)}}
 		 	   		  
	[[alternative HTML version deleted]]



Más información sobre la lista de distribución R-help-es