Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以将大小不等的样本传递给R中的函数引导_R - Fatal编程技术网

是否可以将大小不等的样本传递给R中的函数引导

是否可以将大小不等的样本传递给R中的函数引导,r,R,我目前正在写一篇关于R中引导的教程。我决定使用boot包中的boot函数。我得到了Efron/Tibshirani(1993)的《引导导论》一书,只是复制了他们的一些例子 在这些例子中,他们经常根据不同的样本计算统计数据。例如,他们有一个例子,他们有16只老鼠的样本。其中7只小鼠接受了旨在延长试验手术后存活时间的治疗。其余9只小鼠未接受治疗。收集每只小鼠存活的天数(数值如下) 现在,我想用bootstrapping方法来找出均值的差异是否显著。但是,如果我正确理解了boot的帮助页面,我就不能将

我目前正在写一篇关于
R
中引导的教程。我决定使用
boot
包中的
boot
函数。我得到了Efron/Tibshirani(1993)的《引导导论》一书,只是复制了他们的一些例子

在这些例子中,他们经常根据不同的样本计算统计数据。例如,他们有一个例子,他们有16只老鼠的样本。其中7只小鼠接受了旨在延长试验手术后存活时间的治疗。其余9只小鼠未接受治疗。收集每只小鼠存活的天数(数值如下)

现在,我想用bootstrapping方法来找出均值的差异是否显著。但是,如果我正确理解了
boot
的帮助页面,我就不能将两个样本大小不等的不同样本传递给函数。我的解决办法如下:

#Load package boot
library(boot)
#Read in the survival time in days for each mouse
treatment <- c(94, 197, 16, 38, 99, 141, 23)
control   <- c(52, 104, 146, 10, 51, 30, 40, 27, 46)
#Call boot twice(!)
b1 <- boot(data = treatment,
           statistic = function(x, i) {mean(x[i])},
           R = 10000)
b2 <- boot(data = control,
           statistic = function(x, i) {mean(x[i])},
           R = 10000)
#Compute difference of mean manually
mean_diff <- b1$t -b2$t

但是,现在我必须告诉boot,它必须始终对前7行的7个观察值和后9行的9个观察值进行采样,并将它们作为单独的样本处理。我不知道该怎么做。

我从来没有真正明白引导的最大优势是什么,因为手动编写引导过程非常容易。例如,您可以使用
replicate
尝试以下操作:

myboot1 <- function(){
    booty <- tapply(df$survival,df$group,FUN=function(x) sample(x,length(x),TRUE))
    sapply(booty,mean)
}
out1 <- replicate(1000,myboot1())

再想一想,我意识到我实际上可以将托马斯的答案与
boot
结合起来。以下是一个解决方案:

b <- boot(data=df, 
           statistic = function(x, i) {
             booty <- tapply(x$survival,x$group,FUN=function(x) sample(x,length(x),TRUE))
             diff(sapply(booty,mean))*-1
           },
           R=10000)

b这是
引导中的一个示例。返回

diff.means <- function(d, f)
{    n <- nrow(d)
     gp1 <- 1:table(as.numeric(d$series))[1]
     m1 <- sum(d[gp1,1] * f[gp1])/sum(f[gp1])
     m2 <- sum(d[-gp1,1] * f[-gp1])/sum(f[-gp1])
     ss1 <- sum(d[gp1,1]^2 * f[gp1]) - (m1 *  m1 * sum(f[gp1]))
     ss2 <- sum(d[-gp1,1]^2 * f[-gp1]) - (m2 *  m2 * sum(f[-gp1]))
     c(m1 - m2, (ss1 + ss2)/(sum(f) - 2))
}
grav1 <- gravity[as.numeric(gravity[,2]) >= 7,]
boot(grav1, diff.means, R = 999, stype = "f", strata = grav1[,2])

diff.means正如我所写,
boot.ci
相当整洁。另外,我的“hack”看起来并不比你的复杂,所以并不是说
boot
在不同的示例中会使事情变得更复杂(即使我的hack是最好的解决方案)。当然,你说得有道理。还有其他一些运行引导的解决方案(比如你的nice),它们并不比使用
boot
更复杂。实际上,多亏了你的回答,我找到了一种将它与
boot
相结合的方法,所以+1。谢谢你为什么不使用
t.test
?@Dwin我知道我可以运行
t.test(df$survival~df$group)
作为
boot
的替代方案。然而,这不是我的问题(我的教程中实际上有这一部分)。问题是关于一般情况,我想对比较两个样本的统计数据应用引导。均值差异检验只是一个例子。或者您是否想到了结合
t.test
boot
的方法?在这种情况下,如果你能分享这个解决方案,那就太好了,因为我不太明白怎么做。我想如果你能正确地分层采样,你可以使用t.test(…)$t作为引导统计数据。我认为这个例子只适用于相同大小的样本,但它应该非常简单,使它更通用。我想你只需要一个
gp2,它可以是数字索引、逻辑或权重的向量。使用整数向量上的减号从数据帧或矩阵中删除项。注意,如果这些是逻辑的,那么“-”将不是正确的否定方法。
b <- boot(data=df, 
           statistic = function(x, i) {
             booty <- tapply(x$survival,x$group,FUN=function(x) sample(x,length(x),TRUE))
             diff(sapply(booty,mean))*-1
           },
           R=10000)
diff.means <- function(d, f)
{    n <- nrow(d)
     gp1 <- 1:table(as.numeric(d$series))[1]
     m1 <- sum(d[gp1,1] * f[gp1])/sum(f[gp1])
     m2 <- sum(d[-gp1,1] * f[-gp1])/sum(f[-gp1])
     ss1 <- sum(d[gp1,1]^2 * f[gp1]) - (m1 *  m1 * sum(f[gp1]))
     ss2 <- sum(d[-gp1,1]^2 * f[-gp1]) - (m2 *  m2 * sum(f[-gp1]))
     c(m1 - m2, (ss1 + ss2)/(sum(f) - 2))
}
grav1 <- gravity[as.numeric(gravity[,2]) >= 7,]
boot(grav1, diff.means, R = 999, stype = "f", strata = grav1[,2])