代码之家  ›  专栏  ›  技术社区  ›  Yorgos

引导比较两组

  •  4
  • Yorgos  · 技术社区  · 15 年前

    在下面的代码中,我使用bootstrapping来计算C.I.和p值,这是在零假设下,两种不同的肥料对番茄植株的产量没有影响(另一种选择是“改良”肥料更好)。第一个随机样本(x)来自使用标准肥料的植物,而“改良”样本(y)来自使用第二个样本(y)的植物。

    x <- c(11.4,25.3,29.9,16.5,21.1)
    y <- c(23.7,26.6,28.5,14.2,17.9,24.3)
    total <- c(x,y)
    library(boot)
    diff <- function(x,i) mean(x[i[6:11]]) - mean(x[i[1:5]])
    b <- boot(total, diff, R = 10000)
    
    ci <- boot.ci(b)
    p.value <- sum(b$t>=b$t0)/b$R
    

    对于上面的代码,我不喜欢的是,重新采样的过程就像只有一个11个值的样本一样(将前5个值分离为属于样本x的值,而将其余的值留给样本y)。 你能给我演示一下如何修改这段代码,以便从第一个样本中提取带替换的5号样本,并从第二个样本中分离出6号样本的重新取样,这样引导程序重新取样将模仿产生原始数据的“分离样本”设计吗?

    3 回复  |  直到 13 年前
        1
  •  5
  •   Joris Meys    15 年前

    编辑2: 黑客删除了,因为这是一个错误的解决方案。相反,必须使用引导函数的参数层:

    total <- c(x,y)
    id <- as.factor(c(rep("x",length(x)),rep("y",length(y))))
    b <- boot(total, diff, strata=id, R = 10000)
    ...
    

    请注意,您甚至不会接近正确的P.Value估计值:

    x <- c(1.4,2.3,2.9,1.5,1.1)
    y <- c(23.7,26.6,28.5,14.2,17.9,24.3)
    
    total <- c(x,y)
    
    b <- boot(total, diff, strata=id, R = 10000)
    ci <- boot.ci(b)
    p.value <- sum(b$t>=b$t0)/b$R
    > p.value
    [1] 0.5162
    

    对于两个样本,如果第二个样本的所有值都高于第一个样本的最大值,您如何解释p值为0.51?

    上面的代码可以得到置信区间的有偏估计,但是关于差异的显著性测试应该通过对整个数据集的排列来完成。

        2
  •  1
  •   John    15 年前

    虽然在某些情况下,实际土层可被视为分层变量,但这不是其中之一。你只有一个操作,在植物群之间。因此,你的无效假设是它们确实来自完全相同的群体。在本例中,将这些项目视为来自一组11个样本的项目是引导的正确方法。

    如果你有两块地,在每一块地里,以平衡的方式在不同的季节试验不同的肥料,那么这些地将是稳定的样品,你会想这样对待它们。但事实并非如此。

        3
  •  1
  •   RegressForward    13 年前

    在John之后,我认为使用bootstrap测试这两个不同人群的总和是否显著不同的适当方法如下:

    x <- c(1.4,2.3,2.9,1.5,1.1)
    y <- c(23.7,26.6,28.5,14.2,17.9,24.3)
    
    
    b_x <- boot(x, sum, R = 10000)
    b_y <- boot(y, sum, R = 10000)
    
    z<-(b_x$t0-b_y$t0)/sqrt(var(b_x$t[,1])+var(b_y$t[,1]))
    pnorm(z)
    

    所以我们可以清楚地拒绝空值,因为它们是相同的总体。我可能错过了某种程度的自由调整,我不确定引导在这方面是如何工作的,但是这样的调整不会彻底改变您的结果。