在大数据帧上将p值与ANOVA混淆

时间:2017-06-11 11:37:28

标签: r anova

我试图分析不同国家不同汽车公司业绩价值之间的显着差异。我正在使用ANOVA来做到这一点。

在我的真实数据集上运行ANOVA(30个国家,1000家汽车公司和90000个测量分数),每辆车的零p值都是如此。

对此感到困惑,我创建了一个可重复的示例(下面),包含30个组,3个汽车公司,90000个随机分数。有目的地,我为Benz公司保持1分,你不应该看到国家之间有任何差异。运行anova后,我看到pvalue为0.46而不是1.

有人知道为什么会这样吗?

可重复的例子

set.seed(100000)
qqq <- 90000

df = data.frame(id = c(1:90000), country = c(rep("usa",3000), rep("usb",3000), rep("usc",3000), rep("usd",3000), rep("use",3000), rep("usf",3000), rep("usg",3000), rep("ush",3000), rep("usi",3000), rep("usj",3000), rep("usk",3000), rep("usl",3000), rep("usm",3000), rep("usn",3000), rep("uso",3000), rep("usp",3000), rep("usq",3000), rep("usr",3000), rep("uss",3000), rep("ust",3000), rep("usu",3000), rep("usv",3000), rep("usw",3000), rep("usx",3000), rep("usy",3000), rep("usz",3000), rep("usaa",3000), rep("usab",3000), rep("usac",3000), rep("usad",3000)), tesla=runif(90000), bmw=runif(90000), benz=rep(1, each=qqq))

str(df)
out<-data.frame()

for(j in 3:ncol(df)){
amod2 <- aov(df[,j]~df$country)
out[(j-2),1]<-colnames(df)[j]
out[(j-2),2]<-summary(amod2, test = adjusted("bonferroni"))[[1]][[1,"Pr(>F)"]]
}

colnames(out)<-c("cars","pvalue")
write.table(out,"df.output")

df.output

"cars" "pvalue"
"1" "tesla" 0.245931589754359
"2" "bmw" 0.382730335188437
"3" "benz" 0.465083026215268

1 个答案:

答案 0 :(得分:0)

关于可再现实例中的“苯并”p值:ANOVA分析需要正方差(即非常数数据)。如果违反此假设,模型将退化。从技术上讲,p值基于F统计量,其值是归因于“国家”效应的方差的归一化比率(在您的示例中为“benz”,零)除以总方差(对于“benz”)在您的示例中,为零),因此您的F统计信息具有“值”0/0NaN

由于R计算F统计量的方法(使用QR矩阵分解来提高“近似”退化情况下的数值稳定性),它计算出一个等于1的F统计量(w / 29和89970度)自由)。这给出了p值:

> pf(1, 29, 89970, lower=FALSE)
[1] 0.465083
>

但当然,这在很大程度上毫无意义。

对于您的原始问题,对于大型数据集,相对较小的效果将产生非常小的p值。例如,如果您在上面的df定义之后添加以下内容,则会在国家usa中引入差异:

df = within(df, {
    o = country=="usa"
    tesla[o] = tesla[o] + .1
    bmw[o] = bmw[o] + .1
    benz[o] = benz[o] + .1
    rm(o)
})

你会发现out看起来像这样:

> out
   cars       pvalue
1 tesla 9.922166e-74
2   bmw 5.143542e-74
3  benz 0.000000e+00
>

这是你所看到的,或者你看到它们都是零?