2013-05-01 3 views
2

주어진 크기의 샘플을 생성 제가 아래 코드하여 0과 1 사이 (500)에 균일하게 분산 된 난수들의 샘플을 생성함으로써 시작 : 지금코드 몬테카를로 시뮬레이션 : R

set.seed(1234) 
X<-runif(500, min=0, max=1) 

를, I는 필요 MC 시뮬레이션을 위해 N = 500의 10000 개의 샘플을 생성하고, 새로 생성 된 X의 평균을 계산하며, 반복 수와 평균값을 결과 개체에 저장하는 psuedocode를 작성하십시오. 나는이 시도 적이없는, 지금까지 나는이 있습니다, 그때, 실행 평균을 구 의미하고, 발생한 샘플 수단의 최소/최대에있어

n.iter <-(10000*500) 
results <- matrix (0, n.iter, 4) 

마지막으로, 한 번이 달성 및 MC.table이라는 데이터 프레임에 저장하십시오. (위의 참고 사항, 왜 매트릭스 코드에 "4"가 있는지 잘 모릅니다. 이전 예제로 작업하고 있습니다). 조언이나 도움을 주시면 대단히 감사하겠습니다.

편집 : 작동 할 수 예를 가지고,하지만 난 정말 그것으로 무슨 일이 일어나고 있는지 이해하지 않기 때문에 이것에 대한 유효성에 정교하게하십시오 :

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

R의 데이터 구조와 "for 루프"를 잘 이해하고 있어야합니다. 프로그래머 용 Matloff 's R의 많은 것들 : http://heather.cs.ucdavis.edu/~matloff/R/RProg.pdf –

+0

고마워, 나는 이것에 대해 좀 더 살펴보아야 할 것이다. 나는 진지한 R- 초보자이며, 교수님께서는 재료에 관한 한 번의 강의와 SAS 참조 자료를 사용한 MC 시뮬레이션을 해 주셨습니다. 내가 시도하면 더 잃을 수 없었다! –

+0

질문을 편집하고 세부 정보를 추가하십시오. –

답변

4

install.packages("data.table")을 사용하여 설치할 수있는 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에서 :의 왼쪽에있는 숫자는 행 번호이며 ---은 화면에서 건너 뛴 행을 나타냅니다.

+2

니스,하지만 제 생각에 그것은 첫 번째 타이머에 대한 과잉이라고 생각합니다. :) 당신은'for'와'apply' 솔루션을 추가 할 수 있습니다. –

+0

솔직히 말해서 표준 적용 솔루션을 모르며 루프 용으로 글쓰기에 익숙하지 않습니다. :) 나는 다른 누군가가 그것들을 작전에 쓸 것을 바란다. data.table을 사용하기 전에 제 코드가 정말 혼란 스러웠습니다. – Frank

+0

data.tables와 좋은 접근법 나는 또한 적용에 문제가있다. – Docuemada

2

만약 당신이 의사 코드를 배우고 싶거나 "R"ish 방법을 배우고 싶다면 나는 정말로 대답 할 것이라고 생각합니다. 이 대답은 내가 R과 함께 일하는 법을 배우고 자하는 누군가에게 권하는 것입니다.

먼저 N 개의 열과 10000 개의 행이있는 행렬을 만듭니다. R은 우리가 숫자가 들어가기 위해 미리 공간을 만들 때 그것을 높이 평가합니다.

X=matrix(NA,nrow=10000,ncol=500)

당신은 하나의 행에 대해 500 개 확률 변수를 생성하는 방법을 알고있다.

runif(500,0,1)

지금 당신은 10000 번 일어날 얻는 방법을 알아낼 아마 일하는 것이 루프를 X와 각 하나를 할당해야합니다.

for(i in 1:10000) X[i,]=runif(500,0,1)

그런 다음 각 행의 요약을 얻는 방법을 파악해야합니다. 도움이 될 수있는 기능 중 하나는 rowMeans()입니다.이 숫자는 같은 무엇의 아이디어를 얻을 각 반복

다음 rowMeans(X)

의 수단을 얻을 수 있도록 테이블 X

의 각 행의 평균을 얻으려고 다음의 도움말 페이지를 살펴보고 나는

plot(rowMeans(X))

enter image description here

2

I에 경사 수 있습니다 당신이 간단한 부트 스트랩을 설명한다고 생각해. 결국, 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보다 낮아집니다. 비록 내가 여기에서하지 않았지만 min 값은 단지 위치 1에 있고, 최대 값은 위치 10000에있게 될 것입니다. 리샘플링 수를 낮출 때주의하십시오. 위치를 계산하는 방법은 10 진수 값이되어 혼란 스러울 수 있습니다 R.

그런데, 이것을 함수 형식으로 두었습니다. 라인별로 일을하고 싶다면 function()과 다음 메인 {} 사이의 모든 라인을 실행하십시오.

관련 문제