Category: R

  • 두 항목 비교 함수 만들기

    필요는 발명의 어머니라고 누가 말했던가..

    병리과 논문 뿐만이 아니라, 대부분의 연구에서는 두 그룹사이에서 각종 인자의 비교가 필수적이다. 병리과에서는 대부분의 인자가 2개 혹은 그 이상의 ordinal factor 로 구성되어 있다. 그렇다는 것은 chi-squre 검정을 선택하던가 혹은 fisher 검정을 선택해서 검사를 시행하여야 한다는 것을 의미함. 

    처음에 함수 구성은 비교 항목을 나열하고 그에 따라서 비교하는 부분을 일일이 넣어줬다. 그다지 나쁜 방법은 아니지만, 변경이 있을 경우에 일일이 고쳐줘야 하며 빼먹는 부분도 생기게 마련이다. 그래서 두 항목의 비교만을 다루는 함수를 사전에 만들고, 그 다음에는 각각의 비교 인자에 따라서 비교를 시행하는 함수를 하나 더 만드는 방법으로 시행하기로 하였다.

    여러번 분석을 하다보니 한 줄(column)이나 열(row)에 0으로 가득찬 값이 있으면 통계 분석을 시행하지 못하고 오류메세지와 함께 비교 과정이 중단되기 때문에 이에 대한 것을 확인하는 과정이 필요했다.

    반복구문이 많아지면 실행 속도가 느려지기는 하지만, 뭐 그렇게 CPU나 나쁜 것도 아니고, 내가 복잡한 계산을 수행하는 것도 아니기 때문에 반복 구문을 최대한 활용하기로 하였다.

    compare.fun <- function(parameter.1, parameter.2){

      A <- parameter.1

      B <- parameter.2

    #Matrix 의 Cell 숫자

      cell.number <- nrow(table(A, B)) * ncol(table(A, B)) 

    #한 줄 혹은 한 열에 0 으로 가득찬 경우가 있으면 find.0 라는 값에 1을 더하기.

      find.0 <- 0

      for (X in 1:nrow(table(A, B))){if (length(which(table(A, B)[X, ] == 0)) == ncol(table(A, B))) {find.0 <- find.0 + 1}}

      for (X in 1:ncol(table(A, B))){if (length(which(table(A, B)[, X] == 0)) == nrow(table(A, B))) {find.0 <- find.0 + 1}}

      

    # 한 번이라도 0으로 가득찬 경우가 있으면 일단 계산 수행은 안하는 것으로, 그렇지 않을 경우 계산 수행. Fisher 검정의 조건을 만족하면 Fisher 검정을 그렇지 않다면 chi-squre 검정 수행. 각각의 검정 수행 후 correlation 검사 수행.

      ifelse(find.0 > 0, NA, 

        if (length(which(table(A, B) <= 5)) > 0 & (length(which(table(A, B) <= 5)) / cell.number >= 0.25)) {

          print(fisher.test(A, B))

          print(cor.test(A, B, method=”spearman”))

          } else {print(chisq.test(A, B, correct=FALSE))

                  print(cor.test(A, B, method=”spearman”))

          }

        )

    # 사실 함수 내부에서 만든 값은 내부에서만 사용되기 때문에 다음의 항목은 필요없지만 그래도 넣었음.

      rm(A, B, cell.number, find.0)

    # 중간에 여러줄을 띄우면 구분이 쉽다.

      cat(rep(“\n”,3))

    }

  • EKG handling

    EKG handling

    EKG 에서 V1-V6 까지 QT interval 을 각각 측정해보라는 리뷰어의 지적을 받은 형의 부탁을 받아서 간단하게 QT interval 을 측정할 수 있도록 EKG 이미지를 다루어 보았다. 처음의 생각은 QT interval 까지 측정해 볼 수 있도록 좀 연구를 해볼려고 했는데, T wave가 약한 경우도 많고, 노이즈가 심한 경우도 있고, 전도 장애가 있는 것으로 기계 판독이 나온 경우도 있어서 결국엔 그것은 포기하고 수작업으로 QT interval 을 구하는 방법으로 하되, 그 구하는 과정이 용이하도록 이미지를 조작하는게 더 좋을 것이라는 결론에 이르렀다.

    지금 첨부한 그림은 가장 상단에 II, 그 아래로 V1 에서 V3 까지의 심전도를 약간 확대한 다음 QT 간격을 측정할 수 있을 만큼만 적당히 잘라서 붙인 것이다.

    이 과정에 사용한 패키지는 총 3개이다.

    파일명을 다루는데 사용한 stringr.

    PDF 파일을 PS 파일로 변환하고, 이 PS 파일을 다루기 위한 grImport.

    PS 파일을 PNG 파일로 변환해서 다루었기 때문에 PNG.

    원래 받은 심전도 이미지 파일은 PDF로 되어 있어서 직접 다룰 수가 없었기 때문에 적당한 변환 과정이 필요했다. 우선 리눅스 명령어 중에서 PDF2PS 를 이용하여 PS 파일로 변환하였으며, 이 이미지 파일을 R에서 2배의 크기로 출력한 후 PNG 파일로 저장했고, 이 이미지를 이용했다.

    통상의 3 x 4 심전도 출력물에서 각각의 심전도가 위치하는 위치는 고정되어 있기 때문에 적절한 영역을 지정해서 불러왔다. 그 다음 P 에서 T까지 하나의 심전도가 충분히 포함될 수 있도록 중간 부분만을 선택했다.

    Lead II 에서는 특징적이라고 할 수 있는 위쪽으로 높은 QRS complex 가 관찰이 되며, 이를 수식으로 찾는것이 가장 쉬울 것이라고 생각했다. 그래프를 분석한 것이 아니라, 각각을 구성하고 있는 점을 기반으로 수식으로 구현하기로 했다. 정상적인 경우라면 R파의 Y축의 값이 거의 항상 최고 값을 가지기 때문에, 이를 기준으로 R 의 위치를 추정할 수 있는 지점을 선택할 수 있다. 이 지점들 앞쪽 부근에서 일정 간격으로 기울기를 구하여 기울기가 일정 범위 이상으로 꾸준히 관찰되는 첫 번째 지점을 Q 파에서 R 로 넘어가는 부분으로 지정하기로 하였다. 이 방법은 꽤나 많은 증례에서 꽤 괜찮은 정도로 Q를 찾아 주었다. Q를 찾았으면 이 위치를 기준으로 나머지 V1에서부터 V3까지 같은 지점을 잘라서 붙이면 된다.


    이 알고리즘으로 구할 수 없는 경우를 보면 대부분 left axis deviation 이라는 기계 판독이 나온 경우가 대부분이었다. QRS 의 진폭이 T 보다 작게 나올 경우에도 이 방법을 적용할 수는 없었다.

    RStudio Server 버젼을 설치한 이후 처음을 지속적인 계산이 필요한 작업이었는데, 빠른 컴퓨터로 작업을 할 수 있는 장점을 십분 활용할 수 있어서 좋았다. 

  • readline()

    readline()

    특정 조건을 만족하는 경우를 찾았을 때, 

    그 부분에서 멈추기를 원할 경우 쓸 수 있는

    유용한 명령어 중 하나인 것 같다.

    다른 명령어가 있는지 확인해 보지는 않았지만

    충분히 유용하게 쓸 만한 함수임.

    readline(“press return to continue”)

  • RStudio Server 사용 소감

    RStudio Server 사용 소감

    원래는 고사양의 컴퓨터를 여러 사람이 사용할 수 있게끔 하기 위한 목적으로 알고 있다.

    하지만, 내가 사용하는 주된 목적은 내가 여러 곳에서 컴퓨터로 작업을 하는데 장소의 변경에 따른 작업 흐름이 끊어지지 않도록 하기 위함임.

    사용 소감

    1. 내가 원하는 목적에 맞는 프로그램이다.

    현재까지 사용한 결과에 의하면 장소가 바뀌어도 항상 내가 마지막 사용했던 그대로 사용할 수 있다. 크롬이나 파이어폭스 같이 서버에 즐겨찾기가 저장되는 종류의 웹브라우져라면 어디서나 편하게 사용할 수 있다.

    2. 아직 확인 해보지는 않았지만, 인터넷 창이 종료되어도 하던 계산은 마저 진행될 가능성이 높다. 연산에 시간이 많이 걸리는 작업이라면 작업 실행후 인터넷 창을 꺼버려도 될 것 같음.

    SSH 를 통해서 접속해서 R을 실행시키면 SSH 연결 종료 후에 연산이 종료된다는 문제가 있다. Background 에서 실행하는 방법도 있기는 한 것 같은데, 그런 귀찮은 방법을 사용하기보다 훨씬 더 편하게 이 문제를 해결할 수 있기 때문이다.

    아니면 Remote Desktop 같은 프로그램을 사용해야 하는데, 이러한 프로그램은 필연적으로 입력에 대한 반응속도가 늦다. 작업 자체가 상당히 느려지는데 이러한 문제를 줄일 수 있음.


    3. 재부팅

    컴퓨터를 사용하다보면 재부팅은 피할 수가 없다. 이럴 경우 이전 작업 결과가 보존되는지 확신할 수 없음. 제한된 경험이라서 뭐라 말하기는 그렇지만 작업 결과가 보존이 되는 것 같기는 함. 하지만 장담 못함. 이러한 문제를 예방하기 위해서는 재부팅 전에 작업 환경을 저장하는 것이 필요할 듯.

    4. 유일한 결점인 로그인.

    사용자 계정과 그 비밀번호로 접속을 해야한다는 유일한 결점이 있다. 설정이 변경이 가능한지는 모르겠으나, scp 등을 통한 파일 접속을 위해서라면 굳이 변경할 필요까지는 없다고 판단됨.