의학과 관련된 연구에 있어서 환자의 익명성 보장은 중요한 문제가 된다. 그래서 각종 결과를 넣어둔 자료 파일에서 환자의 정보는 원칙적으로 노출이 되면 안되게 되어 있다. 그에 대한 방법은 여러가지가 있겠지만 크게 2가지 방법을 생각해 보았다.
연구군에 포함된 순서대로 번호를 할당하는 방법이 우선적으로 고려될 수 있다. 이 방법은 임의의 숫자를 할당하는 방법에 대한 고민을 덜 수가 있지만, 앞선 번호의 환자가 오랜 기간 포함되어 있다는 판단을 할 수 있게 하여 bias 를 만들어 낼 수 있는 단점이 있다.
그래서 프로그램을 통하여 임의로 숫자를 만들어내는 방법을 생각해 보았다. R-Project 에서도 다른 프로그램과 마찬가지로 임의의 숫자를 만들어내게 되면 일반적으로 0-1까지 범위내에서 숫자를 만들어내게 된다. 그리도 중복된 숫자가 있는지에 대한 여부를 확인해야 한다. 예전에 사용하던 방법으로는 중복 여부에 대한 확인 과정에서 시간이 걸리는 단점이 있었는데, 이 부분을 획기적으로 줄일 수 있는 방법이 떠올랐다.
임의로 숫자를 만든 후에 오름차순으로 정렬을 한다. N번째에 중복된 수가 있다면, N, N+1 에는 같은 숫자가 있게 된다. 그래서 N+1 번째 값과 N 째의 값이 같으면 중복된 것이 있다고 판단을 할 수 있다. 순환구문으로 이것을 확인하기 때문에 중간에 중복이 발생할 경우 순환구문을 취소하면 되는데 아직 그 것 까지는 못찾았다. 하지만 100만개의 숫자를 만들어서 중복을 확인하였을 때 내 컴퓨터로 5초 정도 소요되기 때문에 더 최적화시켜야 할 이유가 아직은 없다. ㅡㅡ;;
Supplementary 에 환자 정보를 입력할 때 Case number 등을 이런 식으로 만들어 두고, Case number는 R-Project 를 사용하여 임의로 만들어서 각각의 환자에 배정했습니다라는 표현을 쓰면 될것 같다.
해결하야할 문제 1. 중복 발생시 바로 중단하는 방법 찾기
해결하야할 문제 2. 엑셀 파일로 예쁘게 출력하는 방법 찾기.
rm(list=ls(all=TRUE))
RNGkind(kind="Mersenne-Twister")
NUMBER <- 1000000
a <- matrix(nrow=NUMBER, ncol=1)
b <- matrix(nrow=NUMBER, ncol=1)
a[,1] <- trunc(runif(NUMBER) * 10e7)
b[,1] <- sort(a[,1])
COUNT <- 0
for (X in 2:NUMBER)
{if (b[X,1] == b[X-1,1]) {COUNT <- COUNT + 1}}
if (COUNT == 0) {print("Not-duplicated")} else {print("dulicated")}
RNGkind(kind="Mersenne-Twister"); 임의의 수를 만들어내는 기본 방법에 대한 이야기인것 같은데 잘 모르겠음.
NUMBER <- 700; 몇 개를 만들어낼 것인가에 대한 지정
a <- matrix(nrow=NUMBER, ncol=1); 만들어낸 수를 입력하는 행렬을 만들기
b <- matrix(nrow=NUMBER, ncol=1); 중복 확인을 위한 같은 크기의 행렬을 만들기
a[,1] <- trunc(runif(NUMBER) * 10e07); 대충 경험상 100만을 곱해서 소수점 이하를 버리는 경우를 취하면 중복 하지 않는 숫자를 만들기가 쉬웠다.
b[,1] <- sort(a[,1]); 행렬a에 입력된 수를 오름차순으로 정렬하여 b에 입력하기.
COUNT <- 0; 중복이 있는 경우를 확인하기 위한 초기값 설정
for (X in 2:NUMBER){if (b[X,1] == b[X-1,1]) {COUNT <- COUNT + 1}}; ; 2번째 항목부터 중복을 확인하여 중복이 있을 경우 COUNT 항목에 1씩 더한다.
if (COUNT == 0) {print("Not-duplicated")} else {print("dulicated")}; 중복이 없으면 COUNT 값은 초기값 그대로 0이 되기 때문에 Not-duplicated 가 보이게 된다.
연구군에 포함된 순서대로 번호를 할당하는 방법이 우선적으로 고려될 수 있다. 이 방법은 임의의 숫자를 할당하는 방법에 대한 고민을 덜 수가 있지만, 앞선 번호의 환자가 오랜 기간 포함되어 있다는 판단을 할 수 있게 하여 bias 를 만들어 낼 수 있는 단점이 있다.
그래서 프로그램을 통하여 임의로 숫자를 만들어내는 방법을 생각해 보았다. R-Project 에서도 다른 프로그램과 마찬가지로 임의의 숫자를 만들어내게 되면 일반적으로 0-1까지 범위내에서 숫자를 만들어내게 된다. 그리도 중복된 숫자가 있는지에 대한 여부를 확인해야 한다. 예전에 사용하던 방법으로는 중복 여부에 대한 확인 과정에서 시간이 걸리는 단점이 있었는데, 이 부분을 획기적으로 줄일 수 있는 방법이 떠올랐다.
임의로 숫자를 만든 후에 오름차순으로 정렬을 한다. N번째에 중복된 수가 있다면, N, N+1 에는 같은 숫자가 있게 된다. 그래서 N+1 번째 값과 N 째의 값이 같으면 중복된 것이 있다고 판단을 할 수 있다. 순환구문으로 이것을 확인하기 때문에 중간에 중복이 발생할 경우 순환구문을 취소하면 되는데 아직 그 것 까지는 못찾았다. 하지만 100만개의 숫자를 만들어서 중복을 확인하였을 때 내 컴퓨터로 5초 정도 소요되기 때문에 더 최적화시켜야 할 이유가 아직은 없다. ㅡㅡ;;
Supplementary 에 환자 정보를 입력할 때 Case number 등을 이런 식으로 만들어 두고, Case number는 R-Project 를 사용하여 임의로 만들어서 각각의 환자에 배정했습니다라는 표현을 쓰면 될것 같다.
해결하야할 문제 1. 중복 발생시 바로 중단하는 방법 찾기
해결하야할 문제 2. 엑셀 파일로 예쁘게 출력하는 방법 찾기.
RNGkind(kind="Mersenne-Twister")
NUMBER <- 1000000
a <- matrix(nrow=NUMBER, ncol=1)
b <- matrix(nrow=NUMBER, ncol=1)
a[,1] <- trunc(runif(NUMBER) * 10e7)
b[,1] <- sort(a[,1])
COUNT <- 0
for (X in 2:NUMBER)
{if (b[X,1] == b[X-1,1]) {COUNT <- COUNT + 1}}
if (COUNT == 0) {print("Not-duplicated")} else {print("dulicated")}
RNGkind(kind="Mersenne-Twister"); 임의의 수를 만들어내는 기본 방법에 대한 이야기인것 같은데 잘 모르겠음.
NUMBER <- 700; 몇 개를 만들어낼 것인가에 대한 지정
a <- matrix(nrow=NUMBER, ncol=1); 만들어낸 수를 입력하는 행렬을 만들기
b <- matrix(nrow=NUMBER, ncol=1); 중복 확인을 위한 같은 크기의 행렬을 만들기
a[,1] <- trunc(runif(NUMBER) * 10e07); 대충 경험상 100만을 곱해서 소수점 이하를 버리는 경우를 취하면 중복 하지 않는 숫자를 만들기가 쉬웠다.
b[,1] <- sort(a[,1]); 행렬a에 입력된 수를 오름차순으로 정렬하여 b에 입력하기.
COUNT <- 0; 중복이 있는 경우를 확인하기 위한 초기값 설정
for (X in 2:NUMBER){if (b[X,1] == b[X-1,1]) {COUNT <- COUNT + 1}}; ; 2번째 항목부터 중복을 확인하여 중복이 있을 경우 COUNT 항목에 1씩 더한다.
if (COUNT == 0) {print("Not-duplicated")} else {print("dulicated")}; 중복이 없으면 COUNT 값은 초기값 그대로 0이 되기 때문에 Not-duplicated 가 보이게 된다.
'공부해 봅시다 > R-Project' 카테고리의 다른 글
read.table 사용시 주의사항 (0) | 2011.04.11 |
---|---|
EBV 정량 검사 (0) | 2011.01.23 |
Package 설치하기 (0) | 2010.09.09 |
Maximally selected chi-square statistics (0) | 2010.06.11 |
있어 보이는 heatmap 만들기 (0) | 2010.05.31 |