Category: R

  • read.table 사용시 주의사항

    사실 엄청난 삽질을 통해서 알아낸 것이기는 한데 X축에 자료의 평가 항목, Y 축에 증례를 기록하는 일반적인 방식으로 자료를 기록한 경우 R에서 자료를 편하게 불러오는 방법을 확인했다. ㅡ_ㅡ;;

    read.table(“~~.csv”, header = TRUE, sep = “,”, row.names=1)

    row.names 항목을 사용하면 이 부분이 Y 축의 값으로 빠져 나오게 되는데 이러면, 보통 이 값은 통계 분석이 불가능한 문자열의 나열이다. 이 부분을 제외한 나머지 값은 거의 대부분 통계적으로 처리할 수 있는 항목이어서, 자료를 편리하게 다룰 수가 있다. 특히 내가 삽질한 clustering에서 말이다. ㅡㅡ;;

    주의사항으로는 당연한 것이지만, row.names 에 해당할 값에서는 중복된 값이 있어서는 안된다. Microarray 를 사용한 gene expression 자료의 경우 하나의 유전자에 대한 여러 값이 있을 수가 있고, 이럴 때 row.names 에 대항하는 항목을 유전자 이름이나, 염색체 내부의 위치 등으로 해버리면 중복된 값이 있어서 오류가 난다. 중복되는 값을 해결해야 추가 분석이 가능함.

  • EBV 정량 검사

    EBV 정량 검사


      드물게 있는 검사 중 하나인 EBV 정량 검사. 족보대로 판독을 하는거는 쉬운데, Real time-PCR을 이해를 할려고 하니 어렵다. ㅡㅡ
      좀 이상한 부분이 있다면 PCR 소트트웨어가 읽은 값을 바탕으로 내가 직접 선형회귀분석을 한 후 원하는 값을 구하는 과정을 진행해보면 내가 구한 값과 소프트웨어가 구한 값이 약간 차이가 있다는 것이다. 뭐가 문제일까…


    # 자료 입력
    cp <- c(18.21,21.70,24.92,28.32,31.79)
    concentration <- c(2.08e6,2.23e5,2.41e4,2.63e3,3.35e2)

    #밑이 10인 로그값을 사용한다.
    logconc <- log10(concentration)

    #선형회귀함수를 구한다.
    standard <- lm(cp ~ logconc)

    #이 방법으로 그래프 화면을 2개로 나누어서 볼 수 있다.
    par(mfrow=c(2,1))

    #Standard curve 를 그리고
    plot(cp~logconc, xlab=”Log concentration”,ylab=”Crossing
    point”,main=”Standard curve”,type=”p”, col=”red”, lwd=1, pch=4,
    sub=R.version.string)
    #프로그램이 구해준 선형함수를 그린다.
    abline(standard, col=”blue”)

    #y=a+bx 에서 a, b 값은 다음과 같이 추출할 수 있다.
    a <- standard$coefficients[1]
    b <- standard$coefficients[2]

    #아직 좋은 방법을 찾지는 못했고, EBV 정량검사를 위한 수식을 구한 것. 현재 보고 방식으로는 50배 곱한 수치가 필요함.
    x=seq(26,29, by=0.001) ;  그래프를 그리기 위한 x 값의 범위 지정
    y=10^((x-a)/b)*50 ; y 값을 구하기 위한 수식 지정

    #이제 검사 검체의 CP 값에 따른 추정 EBV 정량검사를 알 수 있다.
    plot(x,y, type=”l”, main=”EBV copy numbers”, xlab=”Crossing point”, ylab=”EBV copy numbers”, sub=R.version.string)

    #우리가 구하고자 하는 값의 CP 값.
    x <- c(26.17, 28.25); y <- 10^((x-a)/b)*50

    points(x[1],y[1], col=”red”, cex=3, pch=3);text(x[1],y[1],”Whole Blood”, adj=c(-.1,-.1))
    points(x[2],y[2], col=”red”, cex=3, pch=3);text(x[2],y[2],”Plasma”, adj=c(-.1,-.1))

  • 임의의 수 만들기

      의학과 관련된 연구에 있어서 환자의 익명성 보장은 중요한 문제가 된다. 그래서 각종 결과를 넣어둔 자료 파일에서 환자의 정보는 원칙적으로 노출이 되면 안되게 되어 있다. 그에 대한 방법은 여러가지가 있겠지만 크게 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 가 보이게 된다.

  • Package 설치하기

    install.packages(“패키지 이름”, dependencies=TRUE)

    요렇게 한다. -_-;;