Estou produzindo um script para criar exemplos de inicialização do cats
conjunto de dados (do -MASS-
pacote).
Seguindo o livro de Davidson e Hinkley [1], executei uma regressão linear simples e adotei um procedimento não paramétrico fundamental para o bootstrapping a partir de observações da iid, ou seja, pares de reamostragem .
A amostra original está no formato:
Bwt Hwt
2.0 7.0
2.1 7.2
...
1.9 6.8
Através de um modelo linear univariado, queremos explicar o peso da lareira dos gatos através do seu peso cerebral.
O código é:
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)
Suponha agora que exista uma variável de agrupamento cluster = 1, 2,..., 24
(por exemplo, cada gato pertence a uma ninhada). Para simplificar, suponha que os dados sejam equilibrados: temos 6 observações para cada cluster. Assim, cada uma das 24 ninhadas é composta por 6 gatos (ie n_cluster = 6
e n = 144
).
É possível criar uma cluster
variável falsa através de:
q <- rep(1:24, times=6)
cluster <- sample(q)
c.data <- cbind(cats, cluster)
Eu tenho duas perguntas relacionadas:
Como simular amostras de acordo com a estrutura do conjunto de dados (em cluster)? Ou seja, como reamostrar no nível do cluster? Gostaria de amostrar os clusters com substituição e definir as observações em cada cluster selecionado, como no conjunto de dados original (ou seja, amostragem com reposição dos clusters e sem substituir as observações em cada cluster).
Essa é a estratégia proposta por Davidson (p. 100). Suponha que desenhemos B = 100
amostras. Cada um deles deve ser composto por 24 grupos possivelmente recorrentes (por exemplo cluster = 3, 3, 1, 4, 12, 11, 12, 5, 6, 8, 17, 19, 10, 9, 7, 7, 16, 18, 24, 23, 11, 15, 20, 1
), e cada grupo deve conter as mesmas 6 observações do conjunto de dados original. Como fazer isso R
? (com ou sem o -boot-
pacote.) Você tem sugestões alternativas para prosseguir?
A segunda pergunta diz respeito ao modelo de regressão inicial. Suponha que eu adote um modelo de efeitos fixos , com interceptações em nível de cluster. Isso altera o procedimento de reamostragem adotado?
[1] Davidson, AC, Hinkley, DV (1997). Métodos de inicialização e seus aplicativos . Cambridge University Press.
fonte
Tentei resolver o problema sozinho e produzi o seguinte código.
Embora funcione, provavelmente poderia ser melhorado em termos de velocidade. Além disso, se possível, eu preferiria encontrar uma maneira de usar o
-boot-
pacote, pois ele permite calcular automaticamente vários intervalos de confiança de inicialização através deboot.ci
...Para simplificar, o conjunto de dados inicial consiste em 18 gatos (as observações de "nível inferior") aninhados em 6 laboratórios (a variável de agrupamento). O conjunto de dados é equilibrado (
n_cluster = 3
para cada cluster). Temos um regressorx
, para explicary
.O conjunto de dados falso e a matriz onde armazenar resultados são:
Em cada uma das
B
iterações, o loop seguinte mostra 6 clusters com substituição, cada um composto por 3 gatos amostrados sem substituição (ou seja, a composição interna dos clusters é mantida inalterada). As estimativas do coeficiente de regressor e de seu erro padrão são armazenadas na matriz criada anteriormente:Espero que isso ajude, Lando
fonte
replicate
; como bônus, ele retorna automaticamente ab.sample
matriz para você. Além disso, com toda a mesclagem aqui, você quase certamente está melhor usandodata.table
e reamostrandokey
. Posso contribuir com uma resposta quando chego ao computador ... Pergunta: por que você está acompanhando os erros padrão dos coeficientes?quantile(b.sample[,2], c(.025, .975))
Aqui está uma maneira muito mais simples (e quase indubitavelmente mais rápida) de
data.table
executar o bootstrap usando (nos dados de @ lando.carlissian):fonte
Eu tive que fazer isso recentemente e usado
dplyr
. A solução não é tão elegante quanto comdata.table
, mas:A
inner_join
repete cada linha tendo um determinado valorx
decluster
pelo número de vezes quex
aparece nocluster_sample
.fonte
Oi, uma solução muito simples, baseada em split e lapply, sem necessidade de pacote específico, exceto "boot", por exemplo, com uma estimativa do ICC com base no procedimento nagakawa:
TERCEIRO: execução de auto-inicialização
fonte