在伽玛分布上使用anova()可以得到看似随机的p值

时间:2014-04-04 21:29:30

标签: r

我试图确定两个Gamm分布之间是否存在显着差异。一个分布具有(形状,比例)=(shapeRef,scaleRef)而另一个具有(形状,比例)=(shapeTarget,scaleTarget)。我尝试使用以下代码进行方差分析

n=10000
x=rgamma(n, shape=shapeRef, scale=scaleRef)
y=rgamma(n, shape=shapeTarget, scale=scaleTarget)
glmm1 <- gam(y~x,family=Gamma(link=log))
anova(glmm1)

得到的p值不断变化,可以是<0.1到> 0.9。

我是以错误的方式解决这个问题吗?

编辑:我使用以下代码

f <- gl(2, n)
x=rgamma(n, shape=shapeRef, scale=scaleRef)
y=rgamma(n, shape=shapeTarget, scale=scaleTarget)
xy <- c(x, y)
anova(glm(xy ~ f, family = Gamma(link = log)),test="F")

但是,每次运行它都会得到不同的p值。

1 个答案:

答案 0 :(得分:2)

每次运行时,您确实会获得不同的p值,如果每次都选择不同的实现。就像您的数据值是随机变量一样,您每次运行实验时都会发生变化,p值也是如此。如果零假设为真(在初始尝试中就是这种情况),则p值将均匀分布在0和1之间。

生成模拟数据的功能:

simfun <- function(n=100,shapeRef=2,shapeTarget=2,
                    scaleRef=1,scaleTarget=2) {
    f <- gl(2, n)
    x=rgamma(n, shape=shapeRef, scale=scaleRef)
    y=rgamma(n, shape=shapeTarget, scale=scaleTarget)
    xy <- c(x, y)
    data.frame(xy,f)
}

运行anova()并提取p值的函数:

sumfun <- function(d) {
    aa <- anova(glm(xy ~ f, family = Gamma(link = log),data=d),test="F")
    aa["f","Pr(>F)"]
}

尝试一下,500次:

set.seed(101)
r <- replicate(500,sumfun(simfun()))

p值总是非常小(比例参数的差异很容易区分),但它们确实有所不同:

par(las=1,bty="l") ## cosmetic
hist(log10(r),col="gray",breaks=50)

enter image description here