R - Автоматический анализ нескольких переменных по группам (квадрат хи) - PullRequest
0 голосов
/ 25 сентября 2018
RING    SPECIES        SEX AGE  FAT WEIGHT  WING    WINGPRI BEAK    TARSUS   
H8309   ACCIPITER NISUS M   5   0   141     199     117     19,2    52      
K617    ACCIPITER NISUS F   4   0   288,5   232     167     20,4    62,2    
A264905 ACROCEPHALUS    F   4   2   11,8    64,5    NA      NA      NA      
A358705 ACROCEPHALUS    M   3   2   11      66      50      18,2    22      
A432721 ACROCEPHALUS    U   4   6   14,5    63      48      16      21,9    
O59461  AEGITHALOS      M   4   0   6,4     57      42      8,2     13,8    
O92094  AEGITHALOS      F   2   0   6,8     56      38      7,96    16,54   
O92095  AEGITHALOS      U   2   0   7       58      44      8,78    17,85   

Это небольшая выборка моего фрейма данных («амостра», в данный момент я пытаюсь выяснить, есть ли какие-либо различия между полами у каждого отдельного вида (у меня более 60 в оригинальном df), и для этого мне сказали, что наилучшим подходом является использование значений хи-квадрат переменных WEIGHT, WING, WINGPRI, BEAK и TARSUS

Поэтому мне нужно применить критерий хи-квадрат для каждого отдельного вида, чтобы определить, есть ли какие-либо различия между полами, используя все эти 5 переменных независимо

Я боролся с этим довольно много дней, и до сих пор лучшее, что я мог сделать, это:

for(i in unique(amostra$SPECIES)){
  for (j in 6:10){
  print(
    colnames(amostra[j]))
    names(amostra$SPECIES)
    print(
    chisq.test(amostra$SEX, amostra[,j]))}
}

Что дает мне правильный выход для каждых 5 переменных, но умноженный на количество уникальных видов, которые у меня есть, поэтому я получаю то же значение p для TARSUS x60, а не уникальные значения p для каждого вида, например, только изпеременная TARSUS:

[1] "TARSUS"

    Pearson's Chi-squared test

data:  amostra$SEX and amostra[, j]
X-squared = 1072, df = 758, p-value = 3.53e-13

Я также попробовал это:

subset1 <- amostra[, c(2,3,6:10)]

subset1$SPECIES<- as.factor(subset1$SPECIES)

analise<- function(subset1){
  for (i in 3:7){
    print(
      colnames(amostra[i]))
    print(
      chisq.test(amostra[,2],amostra[,i]))
  }
  subset1
}

by(subset1,subset1$SPECIES,FUN = analise)

, что дает мне огромный вывод, который я не могу увидеть в полном объеме, но initial результат такой же, как и выше, но вместо того, чтобы теперь иметь результат теста хи-квадрат, сгруппированного по видам, я получаю его для всех моих видов ...

---------------------------------------------------------------------------------------- 
subset1$SPECIES: PASSER SP.
        SPECIES SEX WEIGHT WING WINGPRI  BEAK TARSUS
1522 PASSER SP.   F   25.5   74      55 14.64  21.51
1523 PASSER SP.   F     NA   76      56    NA     NA
1524 PASSER SP.   F   29.5   78      58 14.70  20.40
----------------------------------------------------------------------------------------

Я надеюсь, что смогу решить мою проблемуясно, это мой первый пост, поэтому прошу прощения за любые ошибки

Заранее спасибо

1 Ответ

0 голосов
/ 25 сентября 2018

Откладывая статистическую достоверность в сторону, вы выполняете то, что делаете в циклах, с помощью подхода tidyverse / purrr:

library(tidyverse)
library(broom)

df %>%
  select(-RING, -AGE, -FAT) %>%
  gather(variable, value, -SPECIES, -SEX) %>%
  group_by(SPECIES, variable) %>%
  nest() %>% 
  mutate(
    chi_sq_results = map(data, ~ chisq.test(.x$SEX, .x$value)),
    tidied = map(chi_sq_results, tidy)
  ) %>%
  unnest(tidied, .drop = TRUE)

# # A tibble: 15 x 6
#    SPECIES         variable statistic p.value parameter method                                                      
#    <chr>           <chr>        <dbl>   <dbl>     <int> <chr>                                                       
#  1 ACCIPITER NISUS WEIGHT          0    1             1 Pearson's Chi-squared test with Yates' continuity correction
#  2 ACROCEPHALUS    WEIGHT          6.   0.199         4 Pearson's Chi-squared test                                  
#  3 AEGITHALOS      WEIGHT          6.   0.199         4 Pearson's Chi-squared test                                  
#  4 ACCIPITER NISUS WING            0    1             1 Pearson's Chi-squared test with Yates' continuity correction
#  5 ACROCEPHALUS    WING            6.   0.199         4 Pearson's Chi-squared test                                  
#  6 AEGITHALOS      WING            6.   0.199         4 Pearson's Chi-squared test                                  
#  7 ACCIPITER NISUS WINGPRI         0    1             1 Pearson's Chi-squared test with Yates' continuity correction
#  8 ACROCEPHALUS    WINGPRI         0    1             1 Pearson's Chi-squared test with Yates' continuity correction
#  9 AEGITHALOS      WINGPRI         6.   0.199         4 Pearson's Chi-squared test                                  
# 10 ACCIPITER NISUS BEAK            0    1             1 Pearson's Chi-squared test with Yates' continuity correction
# 11 ACROCEPHALUS    BEAK            0    1             1 Pearson's Chi-squared test with Yates' continuity correction
# 12 AEGITHALOS      BEAK            6.   0.199         4 Pearson's Chi-squared test                                  
# 13 ACCIPITER NISUS TARSUS          0    1             1 Pearson's Chi-squared test with Yates' continuity correction
# 14 ACROCEPHALUS    TARSUS          0    1             1 Pearson's Chi-squared test with Yates' continuity correction
# 15 AEGITHALOS      TARSUS          6.   0.199         4 Pearson's Chi-squared test
...