通过自举计算相关系数

时间:2015-06-27 07:46:39

标签: r twitter-bootstrap simulation correlation normal-distribution

我正在研究5种鸟类开始换羽毛的一年中的日子与这5种鸟类完成羽毛蜕皮所需的天数之间的相互关系。

我已尝试在下面的代码中模拟我的数据。对于5个物种中的每一个,我有10个人的开始日和10个人的持续时间。对于每个物种,我计算了平均开始日和平均持续时间,然后计算了这5个物种之间的相关性。

我想要做的是引导平均开始日期并引导每个物种的平均持续时间。我想重复这10,000次,并在每次重复后计算相关系数。然后我想提取10,000相关系数的0.025,0.5和0.975分位数。

我已经模拟了原始数据,但是一旦我尝试引导,我的代码很快变得混乱。任何人都可以帮我这个吗?

# speciesXX_start_day is the day of the year that 10 individuals of birds started moulting their feathers
# speciesXX_duration is the number of days that each individuals bird took to complete the moulting of its feathers
species1_start_day <- as.integer(rnorm(10, 10, 2))
species1_duration <- as.integer(rnorm(10, 100, 2))

species2_start_day <- as.integer(rnorm(10, 20, 2))
species2_duration <- as.integer(rnorm(10, 101, 2))

species3_start_day <- as.integer(rnorm(10, 30, 2))
species3_duration <- as.integer(rnorm(10, 102, 2))

species4_start_day <- as.integer(rnorm(10, 40, 2))
species4_duration <- as.integer(rnorm(10, 103, 2))

species5_start_day <- as.integer(rnorm(10, 50, 2))
species5_duration <- as.integer(rnorm(10, 104, 2))

start_dates <- list(species1_start_day, species2_start_day, species3_start_day, species4_start_day, species5_start_day)
start_duration <- list(species1_duration, species2_duration, species3_duration, species4_duration, species5_duration)

library(plyr)

# mean start date for each of the 5 species
starts_mean <- laply(start_dates, mean)

# mean duration for each of the 5 species
durations_mean <- laply(start_duration, mean)

# correlation between start date and duration
cor(starts_mean, durations_mean)

1 个答案:

答案 0 :(得分:2)

R允许您使用sample函数重新采样数据集。为了引导,您可以随机获取原始数据集的样本(替换),然后重新计算每个子样本的统计数据。您可以将中间结果保存在数据结构中,以便以后可以处理数据。

下面添加了针对您的特定问题的可能示例解决方案。我们为每个物种采用大小为3的10000个子样本,计算统计数据,然后将结果保存在列表或向量中。在引导之后,我们能够处理所有数据:

nrSamples = 10000;
listOfMeanStart = list(nrSamples)
listOfMeanDuration = list(nrSamples)
correlations <- vector(mode="numeric", length=nrSamples)

for(i in seq(1,nrSamples))
{
  sampleStartDate = sapply(start_dates,sample,size=3,replace=TRUE)
  sampleDurations = sapply(start_duration,sample,size=3,replace=TRUE)

  listOfMeans[[i]] <- apply(sampleStartDate,2,mean) 
  listOfMeanDuration[[i]] <- apply(sampleDurations,2,mean)
  correlations[i] <- cor(listOfMeans[[i]], listOfMeanDuration[[i]])
}

quantile(correlations,c(0.025,.5,0.975))