R:在不创建新变量的情况下测试因子的每个级别
假设我有一个带有二进制分组变量和因子的数据帧。这种分组变量的示例可以指定对实验的治疗和控制条件的分配。在下文中,b是分组变量,a是任意因子变量:R:在不创建新变量的情况下测试因子的每个级别,r,factors,dummy-variable,R,Factors,Dummy Variable,假设我有一个带有二进制分组变量和因子的数据帧。这种分组变量的示例可以指定对实验的治疗和控制条件的分配。在下文中,b是分组变量,a是任意因子变量: a <- c("a","a","a","b","b") b <- c(0,0,1,0,1) df <- data.frame(a,b) a从统计角度来看,我不太明白这是在做什么,但这段代码生成了一个列表,其中每个元素都是上面运行的t.test()的输出。 a <- c("a","a","a","b","b") b <-
a <- c("a","a","a","b","b")
b <- c(0,0,1,0,1)
df <- data.frame(a,b)
a从统计角度来看,我不太明白这是在做什么,但这段代码生成了一个列表,其中每个元素都是上面运行的t.test()的输出。
a <- c("a","a","a","b","b")
b <- c(0,0,1,0,1)
df <- data.frame(a,b)
library(dplyr)
library(tidyr)
dfNew<-df %>% group_by(a) %>% summarise(count = n()) %>% spread(a, count)
lapply(1:ncol(dfNew), function (x)
t.test(c(rep(1, dfNew[1,x]), rep(0, length(b)-dfNew[1,x])), b))
下面是一个基本的R
解决方案,它实现了比例相等的chi-squired测试,我相信它更可能回答您对数据提出的任何问题(请参阅我上面的评论):
set.seed(1)
##生成类似但更大/更复杂的玩具数据集
a你所说的平均倾向是什么意思?在我看来,查看这些数据似乎唯一有意义的测试是比例测试,即测试b定义的两组中a水平的相对频率是否相等。与@ErnestA的担忧相呼应,如果你的玩具示例代表了你的实际数据,则t测试不合适,因为你很可能会违反这种程序所做的错误的正常性假设。相反,你可以考虑卡方检验。此外,你应该意识到,在大量的测试中,你犯I型错误的几率相当高。你们都是对的,我忘记了我的基本统计数据。我没有清楚地说出我想要的确切参数,但你们两人对我提出的问题都是正确的。请注意:通常使用df
作为变量名是不好的,因为df()
是F分布密度函数!
a <- c("a","a","a","b","b")
b <- c(0,0,1,0,1)
df <- data.frame(a,b)
library(dplyr)
library(tidyr)
dfNew<-df %>% group_by(a) %>% summarise(count = n()) %>% spread(a, count)
lapply(1:ncol(dfNew), function (x)
t.test(c(rep(1, dfNew[1,x]), rep(0, length(b)-dfNew[1,x])), b))
library(dummies)
new <- dummy.data.frame(df, names = "a")
lapply(1:(ncol(new)-1), function(x)
t.test(new[,x], new[,ncol(new)]))
set.seed(1)
## generate similar but larger/more complex toy dataset
a <- sample(letters[1:4], 100, replace = T)
b <- sample(0:1, 10, replace = T)
head((df <- data.frame(a,b)))
a b
1 b 1
2 b 0
3 c 0
4 d 1
5 a 1
6 d 0
## create a set of contingency tables for proportions
## of each level of df$a to the others
cTbls <- lapply(unique(a), function(x) table(df$a==x, df$b))
## apply chi-squared test to each contingency table
results <- lapply(cTbls, prop.test, correct = FALSE)
## preserve names
names(results) <- unique(a)
## only one result displayed for sake of space:
results$b
2-sample test for equality of proportions without continuity
correction
data: X[[i]]
X-squared = 0.18382, df = 1, p-value = 0.6681
alternative hypothesis: two.sided
95 percent confidence interval:
-0.2557295 0.1638177
sample estimates:
prop 1 prop 2
0.4852941 0.5312500
set.seed(11)
sum(
replicate(1e4, {
a <- sample(letters[1:4], 100, replace = T)
b <- sample(0:1, 100, replace = T)
df <- data.frame(a,b)
cTbls <- lapply(unique(a), function(x) table(df$a==x, df$b))
results <- lapply(cTbls, prop.test, correct = FALSE)
any(lapply(results, function(x) x$p.value < .05))
})
) / 1e4
[1] 0.1642