我首先使用以下代码生成500个均匀分布的0到1之间随机数的样本:
set.seed(1234)
X<-runif(500, min=0, max=1)
现在,我需要编写一个psuedocode,为MC模拟生成10000个N = 500的样本,计算新创建的X的平均值,并将迭代次数和平均值存储在结果对象中。我从未尝试过这个,到目前为止,我有这个:
n.iter <-(10000*500)
results <- matrix (0, n.iter, 4)
最后,一旦完成,我将运行它,然后获得应计样本均值的中位数,平均值和最小值/最大值,并将它们保存到名为MC.table的数据帧中。 (另请注意,上面,我不知道为什么在矩阵代码中有&#34; 4&#34; - 我在前面的例子中工作)。任何建议或帮助将不胜感激。
编辑:我有一个可行的例子,但我真的不明白它的用途,所以请详细说明它的有效性:Ni <- 10000
n <- 500
c <- 0
for (i in n){
for (j in 1:Ni){
c <- c+ 1
d <- data.frame (x= , y= )
results [c,1] <- c
results [c,2] <- j
results [c,3] <- i
results [c,4] <- something( d$x, d$y)
rm (d) } }
如果你甚至可以花时间解释这意味着什么,那么这对我有很大帮助!谢谢!
答案 0 :(得分:5)
您可以尝试使用data.table
,这是一个可以使用install.packages("data.table")
安装的软件包。安装完成后,您将运行类似......
> require(data.table)
> dt <- data.table(x=runif(500*10000),iter=rep(1:500,each=10000))
# x iter
# 1: 0.48293196 1
# 2: 0.61935416 1
# 3: 0.99831614 1
# 4: 0.26944687 1
# 5: 0.38027524 1
# ---
# 4999996: 0.11314160 500
# 4999997: 0.07958396 500
# 4999998: 0.97690312 500
# 4999999: 0.81670765 500
# 5000000: 0.62934609 500
> summaries <- dt[,list(mean=mean(x),median=median(x)),by=iter]
# iter mean median
# 1: 1 0.5005310 0.5026592
# 2: 2 0.4971551 0.4950034
# 3: 3 0.4977677 0.4985360
# 4: 4 0.5034727 0.5052344
# 5: 5 0.4999848 0.4971214
# ---
# 496: 496 0.5013314 0.5048186
# 497: 497 0.4955447 0.4941715
# 498: 498 0.4983971 0.4910115
# 499: 499 0.5000382 0.4997024
# 500: 500 0.5009614 0.4988237
> min_o_means <- min(summaries$mean)
# [1] 0.4914826
我认为语法相当简单。您可能希望使用?
(例如?rep
)查找某些功能。以#开头的行只显示生成的对象。在data.tables中,:
左侧的数字只是行号,---
表示显示中跳过的行。
答案 1 :(得分:2)
我想我给出的答案实际上取决于你是想学习伪代码还是想学习“R”这样做的方法。对于想要学习如何使用R的人,我会推荐这个答案。
首先,我将制作一个包含N列和10000行的矩阵。当我们提前让数字进入时,R会赞赏它。
X=matrix(NA,nrow=10000,ncol=500)
您知道如何为一行生成500个随机变量。
runif(500,0,1)
现在你需要弄清楚如何让它发生10000次并将每一个分配给X.也许for循环可行。
for(i in 1:10000) X[i,]=runif(500,0,1)
然后你需要弄清楚如何获得每一行的摘要。可能有用的一个功能是rowMeans()
。查看其帮助页面,然后尝试获取表X的每一行的平均值
获取每次迭代的方法
rowMeans(X)
然后想知道这些数字是什么样的,我可能会倾向于
plot(rowMeans(X))
答案 2 :(得分:2)
我认为你正在描述一个简单的引导程序。最终,您可能希望使用函数boot。但是在你了解机制之前,我觉得循环是可行的。这应该让你开始:
test<-function(
seed=1234,
sample.size=500,
resample.number=1000,
alpha=0.05
)
{
#initialize original sample
original.sample<-runif(sample.size, min=0, max=1)
#initialize data.frame
resample.results<-data.frame("Run.Number"=NULL,"mean"=NULL)
for(counter in 1:resample.number){
temp<-sample(original.sample, size=length(original.sample), replace = TRUE)
temp.mean<-mean(temp)
temp.table.row<-data.frame("Run.Number"=counter,"mean"=temp.mean)
resample.results<-rbind(resample.results,temp.table.row)
}
resample.results<-resample.results[with(resample.results, order(mean)), ]
#for the mean information
lowerCI.row<-resample.number*alpha/2
upplerCI.row<-resample.number*(1-(alpha/2))
median.row<-resample.number/2
#for the mean information
median<-resample.results$mean[median.row]
lowerCI<-resample.results$mean[lowerCI.row]
upperCI<-resample.results$mean[upplerCI.row]
#for the position information
median.run<-resample.results$Run.Number[median.row]
lowerCI.run<-resample.results$Run.Number[lowerCI.row]
upperCI.run<-resample.results$Run.Number[upplerCI.row]
mc.table<-data.frame("median"=NULL,"lowerCI"=NULL,"upperCI"=NULL)
values<-data.frame(median,lowerCI,upperCI)
#as.numeric because R doesn't like to mix data types
runs<-as.numeric(data.frame(median.run,lowerCI.run,upperCI.run))
mc.table<-rbind(mc.table,values)
mc.table<-rbind(mc.table,runs)
print(mc.table)
}
重新采样数据后,您会找到平均值。然后您订购所有重新采样的方法。该列表的中间是中位数。而且,例如,对于10000次重采样,第250次有序重采样平均值将是您的95%CI较低。虽然我没有在这里做,但最小值将在位置1,最大值将在10000位置。当你降低重采样数时要小心:我计算位置的方式可能会变成十进制值,这会混淆R上。
顺便说一句,我把它放在功能形式中。如果你喜欢逐行做事,只需确保运行function()和以下主要{}之间的所有行