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

Ruben Bermad ruben_bm en hotmail.com
Mar Ene 26 12:17:24 CET 2016


Hola, 
 
desconozco la respuesta a las preguntas que has hecho excepto la relativa a la base de datos. Siento no haberme explicado anteriormente mejor, por lo que te detallo un poco mejor los posibles casos de error de al introducer un mismo ID para diferentes individuos.
 
En algunos casos individuos diferentes pueden haber sido nombrados igual de manera erronea pero sin intencion alguna, y es en esos casos donde debas considerar eliminar esos datos, y puede que en algunos casos no lo puedas diferenciar por ejemplo porque los indiviuos coexistan en el tiempo. 
 
Sin embargo, en el caso que pregunto, el nombrarlos con un mismo ID ha sido voluntariamente debido a que en el momento de la captura de los individuos se considero una buena idea el nombrarlos igual. Desconozco el motivo, pero seguramente fue porque si dos individuos tienen el mismo nombre pero ha pasado 10 años entre ellos solo puede significar que son individuos diferentes y que no tenian mucha imaginacion para poner nuevos nombres. Por ello lo que pretendo es poder automatizar la identificacion de individuos diferentes con un mismo ID, ya que si no lo hago cualquier analisis posteriror estara mal.
 
Espero poder haber contestado a tu pregunta.
Saludos, 
Ruben
 
 
 
To: cof en qualityexcellence.es; ruben_bm en hotmail.com
CC: r-help-es en r-project.org
From: javier.ruben.marcuzzi en gmail.com
Subject: RE: [R-es] Corregir mismo ID para individuos diferentes en una serietemporal
Date: Mon, 25 Jan 2016 20:33:13 -0300

Estimados Creo que ese problema es muy común, almacenar mal la información y darse cuenta al tiempo de análisis. Es el problema que yo encontré cuándo comencé a ser profesional y dejar mis tiempos de estudiante cuándo los ejemplos andan. Mi respuesta va por dos lados: El primero, no comprendo el caso de  1    1     CC En el ejemplo de Carlos Ortega,  en la tabla ref_df línea 34. El segundo lado, ¿Qué pasa por ejemplo trabajando con una base de datos como puede ser sqldf o cualquier herramienta y usar una clave compuesta?CREATE TABLE something (  column1,   column2,   column3,   PRIMARY KEY (column1, column2));Pero si los individuos tienen una vida media de 2 años, más algo de seguridad, ¿hay alguno que viva 3 años?, ¿Se pueden borrar esos registros por estar mal? Javier Rubén Marcuzzi 
De: Carlos Ortega
Enviado: lunes, 25 de enero de 2016 19:09
Para: Ruben Bermad
CC: r-help-es en r-project.org
Asunto: Re: [R-es] Corregir mismo ID para individuos diferentes en una serietemporal Hola, Creo que el código que te adjunto hace lo que pides.Los nuevos ids los he generado con números no con letras, me resulta másfácil tratar el problema así.  #----------------------ID <- c(1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6,1, 2, 6, 8, 12, 7, 15, 16, 17, 18, 19, 20, 1, 21, 22, 19 )Year <- c (1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6)df <- data.frame (ID, Year)df ID <- c(1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6,1, 2, 6, 8, 12, 7, 15, 16, 17, 18, 19, 20, 1, 21, 22, 19 )Year <- c (1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 1, 6, 6, 6)new_ID <- c("A", "B", "C", "D", "E", "F", "G", "A", "B", "C", "H", "I","J", "K", "L", "M", "N", "O", "P", "Q", "R", "M", "N", "Q", "S", "L", "T","U", "V", "W", "X", "Y", "Z", "CC", "AA", "BB", "Y")ref_df <- data.frame (ID, Year, new_ID)ref_df rep_val <- rep(0, nrow(df))new_df <- data.frame(ID=rep_val, Year=rep_val, newID=rep_val,hmyears=rep_val )for(i in 1:nrow(df)) { #Cero  if(i==1) {    new_df$ID[i] <- df$ID[i]    new_df$Year[i] <- df$Year[i]    new_df$newID[i] <- df$ID[i]    new_df$hmyears[i] <- 1  } else {                                #Uno    coin <- which(df$ID[i]==df$ID[1:(i-1)])    print(coin)    if(length(coin) < 1 ) {      new_df$ID[i] <- df$ID[i]      new_df$Year[i] <- df$Year[i]      if(length(which(df$ID[i]==new_df$newID)) < 1) {new_df$newID[i] <-df$ID[i]} else {new_df$newID[i] <- max(new_df$newID)+1}      new_df$hmyears[i] <- 1    } else {                              #Dos      if( new_df$hmyears[max(coin)] < 2 ) {        new_df$ID[i] <- df$ID[i]        new_df$Year[i] <- df$Year[i]        new_df$newID[i] <- new_df$newID[max(coin)]        new_df$hmyears[i] <- new_df$hmyears[max(coin)] + 1      } else {                            #Tres        new_df$ID[i] <- df$ID[i]        new_df$Year[i] <- df$Year[i]        new_df$newID[i] <- max(new_df$newID) + 1        new_df$hmyears[i] <- 1      } #Tres     } #Dos  } #Uno} #Ceronew_df #---------------------- Saludos,Carlos Ortegawww.qualityexcellence.es  El 25 de enero de 2016, 18:11, Ruben Bermad <ruben_bm en hotmail.com> escribió: > 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]]> > > _______________________________________________> R-help-es mailing list> R-help-es en r-project.org> https://stat.ethz.ch/mailman/listinfo/r-help-es>    -- Saludos,Carlos Ortegawww.qualityexcellence.es                 [[alternative HTML version deleted]] _______________________________________________R-help-es mailing listR-help-es en r-project.orghttps://stat.ethz.ch/mailman/listinfo/r-help-es  		 	   		  
	[[alternative HTML version deleted]]



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