Soy nuevo en programación (es decir, bucles y declaraciones if-else), pero no soy nuevo en estadísticas en R.

Tengo alrededor de 16 rasgos que quiero comparar entre hombres y mujeres dentro de 5 poblaciones diferentes, por lo que las comparaciones 5x16. Primero quiero verificar si las variaciones de los rasgos masculinos y femeninos son iguales (var.test) y luego usar esta información para determinar la versión correcta de la función t.test (var = T o var = F). Estoy tratando de escribir un bucle para automatizar este proceso.

Escribí una declaración de funcionamiento if-else:

 if ((var.test(male$mass,female$mass)$p.value < 0.05) == "TRUE") {
   t.test(male$mass,female$mass, var = F)
 } else 
   t.test(male$mass,female$mass, var = T)

Pero parece que no puedo entender cómo aplicar esto a todos mis rasgos.

No quiero usar dos instrucciones anidadas para:

 for (i in c(male$trait1, male$trait2,...)) {
 for (j in c(female$trait1, female$trait2,...)) {
  ...
   }
 }

Porque esto crearía una matriz que realiza var.test y t.test en todas las combinaciones de rasgos. Considerando que, quiero la versión masculina y femenina de cada rasgo emparejado solamente.

Aquí está el formato de mis datos. Hice dos subconjuntos de datos (masculino y femenino):

head(male)
id location  gens log.gens   sex   mass   head   cbl
49   Hawaii   268 2.428135     M 583.86 78.648 65.54           
27   Hawaii   268 2.428135     M 692.30 83.604 69.67
33   Hawaii   268 2.428135     M 647.70 81.180 67.65
34   Hawaii   268 2.428135     M 704.70 84.720 70.60
35   Hawaii   268 2.428135     M 604.90 82.440 68.70
1
M. 0. 24 jun. 2017 a las 22:38

3 respuestas

La mejor respuesta

No estoy segura del formato que esperas obtener.

Algo como esto devolverá una lista

listOfTraits <- c('mass', 'head', 'cbl')
resultList <- lapply(listOfTraits, FUN = function(trait) {
  if (var.test(male[[trait]],female[[trait]])$p.value < 0.05) {
   t.test(male[[trait]],female[[trait]], var = F)
  } else{
   t.test(male[[trait]],female[[trait]], var = T)
  }
})

Segunda solución

listOfTraits <- c('mass', 'head', 'cbl')
resultList <- lapply(listOfTraits, FUN = function(trait) {
  if (var.test(male[[trait]],female[[trait]])$p.value < 0.05) {
    x <-  t.test(male[[trait]],female[[trait]], var = T)
    names(x$estimate) <- c(paste0('male_',trait),paste0('female_',trait))
    x$data.name <- paste0('male_',trait, " and ",paste0('female_',trait))

  } else{
    x <- t.test(male[[trait]],female[[trait]], var = T)
    names(x$estimate) <- c(paste0('male_',trait),paste0('female_',trait))
    x$data.name <- paste0('male_',trait, " and ",paste0('female_',trait))
  }
  x
})
1
mr.joshuagordon 25 jun. 2017 a las 18:14

Lo siento si malinterpretaste tu pregunta, me parece que solo estás tratando de aplicar un bucle a tu primera declaración if-else para que recorra todos los rasgos, como lo hizo en masa. Para hacer referencia al nombre de la columna en el bucle, deberá hacer referencia a las columnas con la notación general: data["numeric row","numeric column"] en lugar de data$"column name".

#cycles through a vector comprised of 1 through the number of columns of the data (assuming the number of traits for each sex is equal). 
for(i in 1:length(male)){

#your if-else, refering to columns with row/column notation. 
 if ((var.test(male[,i],female[,i])$p.value < 0.05) == "TRUE") {
   t.test(male[,i],female[,i], var = F)
 } else {
   t.test(male[,i],female[,i], var = T)
}

Esto aplicará este if-else a todos los rasgos. Tenga en cuenta que esto no almacenará los resultados de las funciones t.test.

1
Dan Woodrich 24 jun. 2017 a las 20:40

Tome la función y use purrr:map() o purrr:map2() que iterará cada valor a través de la función.

0
Mako212 25 jun. 2017 a las 07:53