2014-11-21 7 views
1

대학에서 진행중인 연구 프로젝트의 시뮬레이션을 코드화하려면 R을 사용하고 있습니다. 관련 데이터 구조를 생성하고 데이터를 생성 한 후, 어떤 효과 K에 의해 20x20 매트릭스에서 관측치의 비율 P (0.02 단위로)를 무작위로 수정하려고합니다. 수정 될 관측치를 무작위로 결정하기 위해 행 (rRow) 및 열 (rCol) 인덱스를 나타 내기 위해 P * 400과 같은 정수를 두 번 두 번 사용합니다. 즉, 20 × 20, 0으로 초기화되고, I는 행렬 alrdyModded을 만들중첩 된 while 루프 in for 루프에 대한 문제

  1. 없음 관찰 번 이상 변형되지 않음을 보장하기 위해,이 알고리즘을 수행한다.

  2. 나는 rRow와 rCol에서 첫 번째 값을 취하여 alrdyModded [rRow [1]] [rCol [1]] == 1인지 확인합니다. alrdyModded [rRow [1]] [rCol [1]] == 1, i = 0 일 때까지 인덱스에 대해 임의로 새 정수를 선택합니다.

  3. alrdyModded [rRow [1]] [rCol [1]] == 0, 동일한 인덱스를 갖는 처리 행렬에서의 값을 수정하고 rRow의 전체 길이 alrdyModded [rRow [1] [rCol [1] 1

  4. 반복 변경 rCol 벡터

이 작업을 수행하는 좋은 방법은 while 루프가 for 루프에 중첩되어 있다고 생각합니다.

R의 CODE : I가 R에 다음 코드를 입력 할 때, I는 다음 에러 코드를 수신

propModded<-1.0 
trtSize<-2 
numModded<-propModded*400 

trt1<- matrix(rnorm(400,0,1),nrow = 20, ncol = 20) 
cont<- matrix(rnorm(400,0,1),nrow = 20, ncol = 20) 
alrdyModded1<- matrix(0, nrow = 20, ncol = 20) 

## data structures for computation have been intitialized and filled 

rCol<-sample.int(20,numModded,replace = TRUE) 
rRow<-sample.int(20,numModded,replace = TRUE) 

## indices for modifying observations have been generated 

for(b in 1:numModded){ 

    while(alrdyModded1[rRow[b]][rCol[b]]==1){ 
     rRow[b]<-sample.int(20,1) 
     rCol[b]<-sample.int(20,1)} 

trt1[rRow[b]][rCol[b]]<-'+'(trt1[rRow[b]][rCol[b]],trtSize) 
    alrdyModded[rRow[b]][rCol[b]]<-1  

} 

## algorithm for guaranteeing no observation in trt1 is modified more than once 

R 출력 "동안에 오류 (alrdyModded1 [rRow [B] ] [rCol [b]] == 1) {: TRUE/FALSE가 필요한 TRUE/FALSE가 누락 된 값 "

for 루프를 실행하고 코드를 실행하면 while 루프는 문을 올바르게 평가합니다. 에서 올바른 값에 액세스 할 때 발생하는 문제 rRow 및 rCol 벡터. 이 문제를 해결할 수있는 도움을 주시면 감사하겠습니다.

답변

1

매트릭스에서 색인을 생성하지 않는 것으로 보입니다. while(alrdyModded1[rRow[b]][rCol[b]]==1){과 같은 조건을 갖는 대신 다음과 같이 읽어야합니다 : while(alrdyModded1[rRow[b], rCol[b]]==1){. 행렬은 matrix[1, 1]과 같이 색인이 생성되며 쉼표를 잊어 버린 것처럼 보입니다. 에 대한 루프이 가까이 뭔가해야한다 :

for(b in 1:numModded){ 

    while(alrdyModded1[rRow[b], rCol[b]]==1){ 
    rRow[b]<-sample.int(20,1) 
    rCol[b]<-sample.int(20,1)} 

    trt1[rRow[b], rCol[b]]<-'+'(trt1[rRow[b], rCol[b]],trtSize) 
    alrdyModded1[rRow[b], rCol[b]]<-1  

} 

보조 노트에, 왜 라인 7 alrdyModded1<- matrix(FALSE, nrow = 20, ncol = 20)와 alrdyModded1에게 (단지 TRUE 및 FALSE 값으로 채워) 부울 행렬을 확인하고 조건이 될 수 있지 단지 while(alrdyModded1[rRow[b], rCol[b]]){ 대신에?

+1

색인 생성을 Java 언어와 혼동스럽게 보입니다. 귀하의 추천에 감사 드리며 더 나은 경로 인 것으로 보입니다. – Dan