Bootstrap 与样本量增加的相关性 CI
Bootstrap correlation CI with increasing sample size
我想演示围绕相关性的 95% 置信区间的宽度如何随着样本量的增加而变化,从 n = 10 到 n=100,每轮增加 5 个样本。我假设我们可以使用 bootstrap 函数来执行此操作并将每一轮复制 1000 次。这怎么能在 R 中完成?
看:
http://www.nicebread.de/at-what-sample-size-do-correlations-stabilize/
我们可以使用钻石数据:
data(diamonds)
x <- diamonds$price
y <- diamonds$carat
您可以使用 sapply
遍历您的样本量,并为每个样本量抽取 1000 个适当大小的随机样本,报告置信区间的平均宽度:
set.seed(144)
ci.widths <- sapply(seq(10, 100, 5), function(x) mean(replicate(1000, {
r <- sample(nrow(diamonds), x, replace=TRUE)
diff(cor.test(diamonds$price[r], diamonds$carat[r])$conf.int)
})))
plot(seq(10, 100, 5), ci.widths, xlab="Sample size", ylab="CI width")
您可以自己添加图表和轴标题,但这段代码使用 ggplot2 和 'psychometric' 包可以满足您的需求:
library(ggplot2)
library(psychometric)
corSamp <- function(x) {
# return the correlation between price and carat on diamonds for a given sample size
index <- sample(1:nrow(diamonds), x)
carat <- diamonds$carat[index]
price <- diamonds$price[index]
return(cor(carat, price))
}
cors <- sapply(seq(5,100,5), corSamp)
lower <- sapply(1:20, function(i) return(CIr(r = cors[i], n = seq(5,100,5)[i], level = 0.95)[1]))
upper <- sapply(1:20, function(i) return(CIr(r = cors[i], n = seq(5,100,5)[i], level = 0.95)[2]))
myData <- data.frame(cbind(cors, lower, upper, seq(5,100,5)))
myPlot <- ggplot(myData, aes(x = V4, y = cors)) + geom_line() + geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.5)
这里的V4是样本量。
我想演示围绕相关性的 95% 置信区间的宽度如何随着样本量的增加而变化,从 n = 10 到 n=100,每轮增加 5 个样本。我假设我们可以使用 bootstrap 函数来执行此操作并将每一轮复制 1000 次。这怎么能在 R 中完成? 看: http://www.nicebread.de/at-what-sample-size-do-correlations-stabilize/
我们可以使用钻石数据:
data(diamonds)
x <- diamonds$price
y <- diamonds$carat
您可以使用 sapply
遍历您的样本量,并为每个样本量抽取 1000 个适当大小的随机样本,报告置信区间的平均宽度:
set.seed(144)
ci.widths <- sapply(seq(10, 100, 5), function(x) mean(replicate(1000, {
r <- sample(nrow(diamonds), x, replace=TRUE)
diff(cor.test(diamonds$price[r], diamonds$carat[r])$conf.int)
})))
plot(seq(10, 100, 5), ci.widths, xlab="Sample size", ylab="CI width")
您可以自己添加图表和轴标题,但这段代码使用 ggplot2 和 'psychometric' 包可以满足您的需求:
library(ggplot2)
library(psychometric)
corSamp <- function(x) {
# return the correlation between price and carat on diamonds for a given sample size
index <- sample(1:nrow(diamonds), x)
carat <- diamonds$carat[index]
price <- diamonds$price[index]
return(cor(carat, price))
}
cors <- sapply(seq(5,100,5), corSamp)
lower <- sapply(1:20, function(i) return(CIr(r = cors[i], n = seq(5,100,5)[i], level = 0.95)[1]))
upper <- sapply(1:20, function(i) return(CIr(r = cors[i], n = seq(5,100,5)[i], level = 0.95)[2]))
myData <- data.frame(cbind(cors, lower, upper, seq(5,100,5)))
myPlot <- ggplot(myData, aes(x = V4, y = cors)) + geom_line() + geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.5)
这里的V4是样本量。