鉴于来自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值结果?欢迎使我当前的解决方案更优雅和便携的答案!
答案 0 :(得分:3)
考虑Map
(mapply
的简化包装器)并使用 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