r:使用来自t.test的t统计量和p值填充两个数据帧列

时间:2017-12-07 20:12:58

标签: r

鉴于来自Lock5Data的美国社区调查数据集,我想计算每种种族组合的收入的t-stat(及其Bonferroni校正的p值)。我希望将结果存储在数据框中,其中包含列" race1',' race2,' tstat'和' pval'。通过这种方式,我可以对数据框进行排序,以显示收入中最大(或最重要)的差异。

library(Lock5Data)
data("ACS")
ACS$Sex <- factor(ACS$Sex, labels = c("Female","Male"))
sub_acs <- subset(ACS, select = c("Income","Sex","Race"))
sub_acs <- na.omit(sub_acs)

# form results df (t_df)
race_unique <- unique(sub_acs$Race)
t_df <- expand.grid(race1 = race_unique, race2 = race_unique)
t_df <- t_df[t_df$race1 != t_df$race2,]
rownames(t_df) <- NULL

# fill df col with t-stat
t_df$tstat <- t.test(sub_acs[sub_acs$Race == t_df$race1,]$Income, 
           sub_acs[sub_acs$Race == t_df$race2,]$Income, 
           p.adjust.methods='bonferroni')$statistic

# fill df col with p_val
t_df$pval <- t.test(sub_acs[sub_acs$Race == t_df$race1,]$Income, 
           sub_acs[sub_acs$Race == t_df$race2,]$Income, 
           p.adjust.methods='bonferroni')$p.value

不幸的是,结果t_df似乎只显示了在所有行中重复的每个测试的第一个结果。如何正确映射t统计量和p值结果?欢迎使我当前的解决方案更优雅和便携的答案!

2 个答案:

答案 0 :(得分:3)

考虑Mapmapply的简化包装器)并使用 t_df 作为辅助数据帧,将唯一值传递到 m ultiple 应用方法。

t_df <- subset(expand.grid(race1 = race_unique, race2 = race_unique), race1 < race2)

ttest_proc <- function(r1, r2) {    
   output <- t.test(sub_acs[sub_acs$Race == r1,]$Income, 
                    sub_acs[sub_acs$Race == r2,]$Income, 
                    p.adjust.methods='bonferroni')

   df <- data.frame(race1 = r1,
                    race2 = r2, 
                    t_stat = output$statistic, 
                    p_val = output$p.value)    
   return(df)    
}

df_list <- Map(ttest_proc, t_df$race1, t_df$race2)

final_df <- do.call(rbind, df_list)

答案 1 :(得分:2)

你在找这样的东西吗?

cbn <- t(combn(as.character(race_unique), 2))
pval <- numeric(nrow(cbn))
tstat <- numeric(nrow(cbn))

for(i in seq_len(nrow(cbn))){
    a <- subset(sub_acs, Race %in% cbn[i, ])
    tt <- t.test(Income ~ Race, data = a, p.adjust.methods = 'bonferroni')
    pval[i] <- tt$p.value
    tstat[i] <- tt$statistic
}

result <- data.frame(race1 = cbn[, 1], race2 = cbn[, 2], p.value = pval, statistic = tstat)
result 
#  race1 race2     p.value  statistic
#1 white black 0.190337465 -1.3173942
#2 white other 0.007776557 -2.7231317
#3 white asian 0.203332407  1.2831045
#4 black other 0.365064209  0.9092968
#5 black asian 0.050391428  1.9782605
#6 other asian 0.005943459  2.8158303