代码之家  ›  专栏  ›  技术社区  ›  Haakonkas

做chisq。用于多对比较的数据帧测试

  •  1
  • Haakonkas  · 技术社区  · 7 年前

    species <- c("a","a","a","b","b","b","c","c","c","d","d","d","e","e","e","f","f","f","g","h","h","h","i","i","i")
    category <- c("h","l","m","h","l","m","h","l","m","h","l","m","h","l","m","h","l","m","l","h","l","m","h","l","m")
    minus <- c(31,14,260,100,70,200,91,152,842,16,25,75,60,97,300,125,80,701,104,70,7,124,24,47,251)
    plus <- c(2,0,5,0,1,1,4,4,30,1,0,0,2,0,5,0,0,3,0,0,0,0,0,0,4)
    df <- cbind(species, category, minus, plus)
    df<-as.data.frame(df)
    

    我想做一个chisq。对每个类别物种组合进行测试,如下所示:

    物种a、h和l类:p值

    使用以下chisq。测试(虚拟代码):

    chisq.test(c(minus(cat1, cat2),plus(cat1, cat2)))$p.value
    

    Species   Category1  Category2   p-value
    a         h          l           0.05
    a         h          m           0.2
    a         l          m           0.1
    b...
    

    其中类别和类别2是chisq中的比较类别。测验

    here here ,但在我看来,它们并不真正适用于这个问题。

    我还想看看如何为以下数据集做到这一点:

    species <- c(1:11)
    minus <- c(132,78,254,12,45,76,89,90,100,42,120)
    plus <- c(1,2,0,0,0,3,2,5,6,4,0)
    

    species1  species2  p-value
    1         2         0.5
    1         3         0.7
    1         4         0.2
    ...
    11        10        0.02
    

    我尝试将上述代码更改为以下代码:

    species_chisq %>%
    do(data_frame(species1 = first(.$species),
                species2 = last(.$species),
                data = list(matrix(c(.$minus, .$plus), ncol = 2)))) %>%
    mutate(chi_test = map(data, chisq.test, correct = FALSE)) %>%
    mutate(p.value = map_dbl(chi_test, "p.value")) %>%
    ungroup() %>%
    select(species1, species2, p.value) %>%
    

    我通过找到的代码做到了这一点 here

    2 回复  |  直到 7 年前
        1
  •  2
  •   www    7 年前

    来自的解决方案 dplyr purrr chisq.test(test, correct = FALSE) .

    cbind 只是 data.frame stringsAsFactors = FALSE 重要的是防止列成为因素。

    # Create example data frame
    species <- c("a","a","a","b","b","b","c","c","c","d","d","d","e","e","e","f","f","f","g","h","h","h","i","i","i")
    category <- c("h","l","m","h","l","m","h","l","m","h","l","m","h","l","m","h","l","m","l","h","l","m","h","l","m")
    minus <- c(31,14,260,100,70,200,91,152,842,16,25,75,60,97,300,125,80,701,104,70,7,124,24,47,251)
    plus <- c(2,0,5,0,1,1,4,4,30,1,0,0,2,0,5,0,0,3,0,0,0,0,0,0,4)
    df <- data.frame(species, category, minus, plus, stringsAsFactors = FALSE)
    
    # Load packages
    library(dplyr)
    library(purrr)
    
    # Process the data
    df2 <- df %>%
      group_by(species) %>%
      slice(c(1, 2, 1, 3, 2, 3)) %>%
      mutate(test = rep(1:(n()/2), each = 2)) %>%
      group_by(species, test) %>%
      do(data_frame(species = first(.$species),
                    test = first(.$test[1]),
                    category1 = first(.$category),
                    category2 = last(.$category),
                    data = list(matrix(c(.$minus, .$plus), ncol = 2)))) %>%
      mutate(chi_test = map(data, chisq.test, correct = FALSE)) %>%
      mutate(p.value = map_dbl(chi_test, "p.value")) %>%
      ungroup() %>%
      select(species, category1, category2, p.value)
    
    df2
    # A tibble: 25 x 4
       species category1 category2   p.value
         <chr>     <chr>     <chr>     <dbl>
     1       a         h         l 0.3465104
     2       a         h         m 0.1354680
     3       a         l         m 0.6040227
     4       b         h         l 0.2339414
     5       b         h         m 0.4798647
     6       b         l         m 0.4399181
     7       c         h         l 0.4714005
     8       c         h         m 0.6987413
     9       c         l         m 0.5729834
    10       d         h         l 0.2196806
    # ... with 15 more rows
    
        2
  •  1
  •   Vincent Bonhomme    7 年前

    data.frame 具有 否则 minus plus 列转换为 factor

    species <- c("a","a","a","b","b","b","c","c","c","d","d","d","e","e","e","f","f","f","g","h","h","h","i","i","i")
    category <- c("h","l","m","h","l","m","h","l","m","h","l","m","h","l","m","h","l","m","l","h","l","m","h","l","m")
    minus <- c(31,14,260,100,70,200,91,152,842,16,25,75,60,97,300,125,80,701,104,70,7,124,24,47,251)
    plus <- c(2,0,5,0,1,1,4,4,30,1,0,0,2,0,5,0,0,3,0,0,0,0,0,0,4)
    df <- data.frame(species=species, category=category, minus=minus, plus=plus)
    

    那么,我不确定是否有一个纯粹的 dplyr 方法(很高兴看到相反的结果),但我认为这是一个部分原因-

    df_combinations <-
      # create a df with all interactions
      expand.grid(df$species, df$category, df$category)) %>% 
      # rename columns
      `colnames<-`(c("species", "category1", "category2")) %>% 
      # 3 lines below:
      # manage to only retain within a species, category(1 and 2) columns
      # with different values
      unique %>% 
      group_by(species) %>% 
      filter(category1 != category2) %>% 
      # cosmetics
      arrange(species, category1, category2) %>%
      ungroup() %>% 
      # prepare an empty column
      mutate(p.value=NA)
    
    # now we loop to fill your result data.frame
    for (i in 1:nrow(df_combinations)){
      # filter appropriate lines
      cat1 <- filter(df,
                     species==df_combinations$species[i],
                     category==df_combinations$category1[i])
      cat2 <- filter(df,
                     species==df_combinations$species[i],
                     category==df_combinations$category2[i])
      # calculate the chisq.test and assign its p-value to the right line
      df_combinations$p.value[i] <- chisq.test(c(cat1$minus, cat2$minus,
                                                 cat1$plus, cat2$plus))$p.value  
    
    }
    

    数据框架 :

    head(df_combinations)
    # A tibble: 6 x 4
    # A tibble: 6 x 4
    # Groups:   species [1]
    species category1 category2       p.value
    <fctr>    <fctr>    <fctr>         <dbl>
    1       a         h         l  3.290167e-11
    2       a         h         m 1.225872e-134
    3       a         l         h  3.290167e-11
    4       a         l         m 5.824842e-150
    5       a         m         h 1.225872e-134
    6       a         m         l 5.824842e-150
    

    检查第一行: 奇斯克。测试(c(31,14,2,0))$p.value

    这是你想要的吗?