R 引导分层/多级数据(重新采样群集)
我正在生成一个脚本,用于从R 引导分层/多级数据(重新采样群集),r,hierarchical-clustering,statistics-bootstrap,R,Hierarchical Clustering,Statistics Bootstrap,我正在生成一个脚本,用于从cats数据集(从-MASS-包)创建引导示例 遵循Davidson和Hinkley教科书[1],我运行了一个简单的线性回归,并采用了一个基本的非参数过程,从iid观测值进行自举,即对重采样 原始样本的格式为: Bwt Hwt 2.0 7.0 2.1 7.2 ... 1.9 6.8 通过一个单变量线性模型,我们想通过猫的大脑重量来解释猫的体重 代码是: library(MASS) library(boot) ################
cats
数据集(从-MASS-
包)创建引导示例
遵循Davidson和Hinkley教科书[1],我运行了一个简单的线性回归,并采用了一个基本的非参数过程,从iid观测值进行自举,即对重采样
原始样本的格式为:
Bwt Hwt
2.0 7.0
2.1 7.2
...
1.9 6.8
通过一个单变量线性模型,我们想通过猫的大脑重量来解释猫的体重
代码是:
library(MASS)
library(boot)
##################
# CATS MODEL #
##################
cats.lm <- glm(Hwt ~ Bwt, data=cats)
cats.diag <- glm.diag.plots(cats.lm, ret=T)
#######################
# CASE resampling #
#######################
cats.fit <- function(data) coef(glm(data$Hwt ~ data$Bwt))
statistic.coef <- function(data, i) cats.fit(data[i,])
bootl <- boot(data=cats, statistic=statistic.coef, R=999)
我有两个相关的问题:
如何根据(群集)数据集结构模拟样本?也就是说,如何在簇级重新采样?我想对替换后的簇进行采样,并将每个选定簇内的观测值设置为原始数据集中的观测值(即,使用替换后的簇进行采样,而不替换每个簇内的观测值)
这是戴维森提出的战略(第100页)。
假设我们绘制B=100
样本。其中每一个都应该由24个可能反复出现的聚类组成(例如,聚类=3,3,1,4,12,11,12,5,6,8,17,19,10,9,7,7,16,18,24,23,11,15,20,1),每个聚类应该包含原始数据集的相同6个观察值。如何在R
中执行此操作?(带或不带-boot-
软件包。)您对继续操作有其他建议吗
第二个问题涉及初始回归模型。假设我采用了一个带有集群级截获的固定效应模型是否改变了所采用的重采样程序
[1] 戴维森,A.C.,辛克利,D.V.(1997)。引导方法及其应用。剑桥大学出版社。如果我理解正确,这就是您试图使用c.data
作为输入的原因:
- 使用替换对簇进行重采样
- 维护随机样本中的每个聚类与其原始数据集(即c数据)中的点之间的关联
- 使用采样的集群创建引导
下面是一个实现这一点的脚本,您可以将其封装到一个函数中重复R次,其中R是引导复制的数量
q <- rep(1:24, times=6)
cluster <- sample(q)
c.data <- cbind(cats, cluster)
# get a vector with all clusters
c <- sort(unique(c.data$cluster))
# group the data points per cluster
clust.group <- function(c) {
c.data[c.data$cluster==c,]
}
clust.list <- lapply(c,clust.group)
# resample clusters with replacement
c.sample <- sample(c, replace=T)
clust.sample <- clust.list[c.sample]
clust.size <- 6
# combine the cluster list back to a single data matrix
clust.bind <- function(c) {
matrix(unlist(c),nrow=clust.size)
}
c.boot <- do.call(rbind,lapply(clust.sample,clust.bind))
# Just to maintain columns name
colnames(c.boot) <- names(c.data)
# the new data set (single bootstrap replicate)
c.boot
q我试图用以下方法解决这个问题。
虽然它可以工作,但它可能在速度和“优雅”方面有所改进。此外,如果可能的话,我更愿意找到一种使用-boot-
包的方法,因为它允许通过boot.ci
自动计算一些引导置信区间
为简单起见,起始数据集由嵌套在6个实验室(聚类变量)中的18个CAT(较低级别)观测值组成。数据集是平衡的(n_cluster=3
针对每个集群)。我们有一个回归器,x
,用于解释y
假数据集和存储结果的矩阵为:
# fake sample
dat <- expand.grid(cat=factor(1:3), lab=factor(1:6))
dat <- cbind(dat, x=runif(18), y=runif(18, 2, 5))
# empty matrix for storing coefficients estimates and standard errors of x
B <- 50 # number of bootstrap samples
b.sample <- matrix(nrow=B, ncol=3, dimnames=list(c(), c("sim", "b_x", "se_x")))
b.sample[,1] <- rep(1:B)
最终引导的标准错误是:
boot_se_x <- sum(b.sample[,3])/(B-1)
boot_se_x
boot_se_x你是说,没有创建集群变量的三行代码?你会如何改进这个问题?谢谢你的提示。我已经在那里写了一篇文章。不过,至少问题的第一部分完全是基于R.。再次感谢。我猜从集群中进行替换采样的解决方案是“手动”编写代码(不使用-boot-
包)。不幸的是,我在R编码方面做得不够好。让我确保我正确地理解你。您的输入将是c.data,您将它附加到一个随机生成的集群。您希望对簇(即1-24)重新采样,同时从原始数据集(即c数据)跟踪与每个簇相关的6个数据点。对吧?好吧,赏金是你的!再次感谢。斯特凡诺
####################################
# loop through "b.sample" rows #
####################################
for (i in seq(1:B)) {
### sampling with replacement from the clustering variable
# sampling with replacement from "cluster"
cls <- sample(unique(dat$lab), replace=TRUE)
cls.col <- data.frame(lab=cls)
# reconstructing the overall simulated sample
cls.resample <- merge(cls.col, dat, by="lab")
### fitting linear model to simulated data
# model fit
mod.fit <- function(data) glm(data$y ~ data$x)
# estimated coefficients and standard errors
b_x <- summary(mod.fit(data=cls.resample))$coefficients[2,1]
se_x <- summary(mod.fit(data=cls.resample))$coefficients[2,2]
b.sample[i,2] <- b_x
b.sample[i,3] <- se_x
}
boot_se_x <- sum(b.sample[,3])/(B-1)
boot_se_x