2017-12-28 18 views
0

Die Daten sieht wie folgt aus:Vergleichen Mittel nur für bestimmte Gruppenkombinationen

> data <- read.csv("data.csv") 
> head(data) 
    ï..class.1 rev.1 class.2 rev.2 
1   7 136.9900 1318 31.9900 
2  1223 24.0984 1001 0.0000 
3  1318 61.9900 6851 104.2655 
4  1014 39.9800 1318 29.9800 
5   7 32.9800 7  52.9900 
6  291 107.6674  797 31.2741 

Ich möchte einen Signifikanztest ausführen, um die Mittel von rev.1 zu vergleichen und Rev.2 nur dort, wo Gruppen class.1 = class .2. Zum Beispiel versuche ich, alle "7" Klassen zu vergleichen, dann werden alle 1318 Klassen verglichen. Ich habe versucht, dies mit ANOVA und TukeyHSD zu tun, aber habe Probleme, nur die Gruppen zu vergleichen, die ich will. Jede Anleitung würde sehr geschätzt werden!

+1

Willkommen bei StackOverflow! Bitte lesen Sie die Informationen über [wie man eine gute Frage stellt] (http://stackoverflow.com/help/how-to-ask) und wie man ein [reproduzierbares Beispiel gibt] (http://stackoverflow.com/questions/ 5963269). Dies wird es anderen sehr erleichtern, Ihnen zu helfen. – Sotos

+0

Jetzt sehe ich, dass Sie die gleiche Frage zweimal gestellt haben: https://stackoverflow.com/questions/47999190/test-for-significance-of-specific-multiple-groups-in-r. Bitte mach das nicht beim nächsten Mal. – www

Antwort

0

Sieht aus wie die Zeilendaten nicht ausgerichtet sind. Wenn dies der Fall ist, könnten die Daten in zwei Gruppen aufgeteilt und übereinander gestapelt werden. Spaltennamen wären: class, class_id, rev. Von dort können Sie nach der interessierenden class_id filtern und dann mit Ihrer Analyse fortfahren.

library(dplyr) 
library(tidyr) 

# create some data 
rev.1 <- rnorm(100, 200,50) 
rev.2 <- rnorm(100, 180,35) 

class.1 <- seq.int(from = 1000, by = 10, length.out = 100) 
class.2 <- seq.int(from = 1000, by = 20, length.out = 100) 

df <- tibble(class.1 = class.1, rev.1 = rev.1, class.2 = class.2, rev.2 = rev.2) 


# split the data and stack 
group_1 <- df %>% 
    select(class.1, rev.1) %>% 
    gather(key = class, 
     value = class_id, 
     -rev.1) %>% 
    rename(rev = rev.1) 

group_2 <- df %>% 
    select(class.2, rev.2) %>% 
    gather(key = class, 
     value = class_id, 
     -rev.2) %>% 
    rename(rev = rev.2) 

df_stacked <- rbind(group_1, group_2) 

# filter for the class_id of interest 
df_filtered <- df_stacked %>% 
    filter(class_id == 1020) 
0

Wenn Sie die Mittel aus zwei Gruppen vergleichen möchten, scheint mir, dass T-Test eine gute Wahl ist. Hier ist eine Option mit . Zuerst habe ich einen Beispieldatenrahmen namens dat erstellt.

# Load package 
library(tidyverse) 

# Set seed 
set.seed(12345) 

# Create example data frame 
dat <- expand.grid(class1 = 1:5, class2 = 1:5) %>% 
    slice(rep(1:n(), 5)) %>% 
    mutate(rev1 = rnorm(n()), rev2 = rnorm(n())) %>% 
    mutate(rev2 = sample(rev2, size = n(), replace = TRUE)) 
# View the head of data frame 
dat 
# # A tibble: 125 x 4 
# class1 class2 rev1 rev2 
#  <int> <int> <dbl> <dbl> 
# 1  1  1 0.586 0.548 
# 2  2  1 0.709 0.868 
# 3  3  1 -0.109 0.0784 
# 4  4  1 -0.453 -0.567 
# 5  5  1 0.606 -0.0767 
# 6  1  2 -1.82 0.167 
# 7  2  2 0.630 2.66 
# 8  3  2 -0.276 0.831 
# 9  4  2 -0.284 -1.70 
# 10  5  2 -0.919 -2.13 
# # ... with 115 more rows 

Danach wird filtriert I den Datenrahmens, wenn class1 == class2, Gruppe der Daten durch class1 und dann t-Test unter Verwendung der do Funktion durchzuführen. Schließlich kann map_dbl den p.value jedes t.test zu einem neuen Datenrahmen erhalten.

Wenn Sie auf das Testergebnis einer bestimmten Klasse zugreifen möchten, können Sie Folgendes tun.

# Get the result of the first class 
dat2$TTest[dat2$class == 1] 
# [[1]] 
# 
# Welch Two Sample t-test 
# 
# data: .$rev1 and .$rev2 
# t = 0.40118, df = 7.3956, p-value = 0.6996 
# alternative hypothesis: true difference in means is not equal to 0 
# 95 percent confidence interval: 
# -0.9379329 1.3262368 
# sample estimates: 
# mean of x mean of y 
# 0.6033533 0.4092013 

Hier ist eine weitere Option können wir auch den Datenrahmen zu einer Liste verteilen und den t-Test durch die Liste anwenden.

# Split the data frame and conduct T-test 
dat_list <- dat %>% 
    filter(class1 == class2) %>% 
    split(.$class1) %>% 
    map(~t.test(.$rev1, .$rev2)) 

# Get the result of the first class 
dat_list$`1` 

# Welch Two Sample t-test 
# 
# data: .$rev1 and .$rev2 
# t = 0.40118, df = 7.3956, p-value = 0.6996 
# alternative hypothesis: true difference in means is not equal to 0 
# 95 percent confidence interval: 
# -0.9379329 1.3262368 
# sample estimates: 
# mean of x mean of y 
# 0.6033533 0.4092013 
Verwandte Themen