Я использую подход итеративной передискретизации для оценки размера выборки, необходимого для достижения относительной стандартной ошибки менее 25 от среднего значения выборки. Вот визуализация того, как расположены данные (df):
SPP Zone3 CPNN Month Year
1 ALW Upper 15 May 2016
2 ALW Upper 9 May 2016
3 ALW Lower 57 May 2017
4 ALW Middle 32 June 2016
...
98 ALW Lower 29 June 2017
99 ALW Lower 41 July 2016
100 ALW Middle 19 July 2017
Собранные данные были сгруппированы для анализа с использованием комбинации Месяц * Год и в следующем формате:
simdat<- dcast(df, Year+Month~"count", value.var="CPNN", sum)
simdat$id<- c(1:nrow(simdat))
df<- merge(df,simdat[,-4], by=c('Year','Month'))
df<- df[order(df$id),]
Повторная выборка переменной "CPNN" начинается с размера выборки, равного двум, создает 2000 итераций, и если RSE <= 25 on> = 80% выборок, процесс заканчивается. Однако, если это не будет достигнуто, следующая итерация будет происходить до тех пор, пока не будет достигнут процесс или не будет получено максимум 150 выборок. Код для этой части анализа ниже:
nreps_all<-2000
sim<- function(id_indx)
{ # FUNCTION TO GET 80% OF SAMPLES WITH AN RSE25
nreps=nreps_all
#print(id_indx)
X<- data.frame()
for(n in 2:150)
{
yy<- matrix(sample(df[df$id==id_indx,]$CPNN,n*nreps,replace=TRUE),nrow=n,
ncol=nreps)
vals<- sapply(c(1:nreps),function(x) ifelse(sum(yy[,x])==0, 1,
sd(yy[,x])/sqrt(n)/mean(yy[,x])))
vals<- mean(ifelse(vals<=0.25, 1,0))
X<- rbind(X,c(n,vals))
if(vals>=0.8) break
}
return(max(X[,1]))
}
##Run
(rse25<- sapply(simdat$id, sim))
Мне интересно, есть ли какой-либо возможный способ (с использованием предоставленного кода), чтобы разделить образцы так, чтобы они были отобраны в равных пропорциях из категории "Zone3". В идеале это должно происходить случайным образом с заменой и в равной степени в каждой из трех зон. Можно ли было это встроить при создании переменной "yy" в приведенном выше коде? Спасибо за любую помощь!