我试图分析不同国家不同汽车公司业绩价值之间的显着差异。我正在使用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
答案 0 :(得分:0)
关于可再现实例中的“苯并”p值:ANOVA分析需要正方差(即非常数数据)。如果违反此假设,模型将退化。从技术上讲,p值基于F统计量,其值是归因于“国家”效应的方差的归一化比率(在您的示例中为“benz”,零)除以总方差(对于“benz”)在您的示例中,为零),因此您的F统计信息具有“值”0/0
或NaN
。
由于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
>
这是你所看到的,或者你看到它们都是零?