mpfit 함수를 이용한 회귀분석

게시판 IDL Q&A mpfit 함수를 이용한 회귀분석

이 게시글은 1개 답변과 2명 참여가 있으며 마지막으로  Jonghyuk Yi에 의해 1 월 전에 업데이트 됐습니다.

  • 글쓴이
  • #5091

    Yanghyeji
    회원

    안녕하세요.. 선형회귀 시 y절편을 0으로 고정시키고자 하다보니 아래와 같은 mpfit 라이브러리를 사용하게 되었습니다.. 그런데.. 아래와 같이 작성하여 실행시킬 때 처음에는 무조건 syntax error가 났다가 이후부터 실행되되다 안 되다 합니다.

    회귀에 사용한 변수는 talh, talc로 두 위성의 반사도를 의미합니다.

    =============== script 내 mpfit 사용 부분 ===============
    xx = findgen(10)
    plot,talh,talc,color=0,/nodata
    oplot,[0,10],[0,10],color=0

    expr=’p[0]+p[1]*x’
    pi=replicate({fixed:0,limited:[0,0],limits:[0,0],value:0.},2)
    pi[0].fixed=1
    pi[0].value=0.

    oplot,talh,talc,color=82,psym=2,symsize=0.5
    p1=mpfitexpr(expr,talh,talc,parinfo=pi)
    oplot,xx,mpevalexpr(expr,xx,p1), color=87, linest=2, thick=2
    ===================================================

    이 때 오류메시지는

    p1=mpfitexpr(expr,talh,talc,parinfo=pi)
    ^
    % Syntax error.
    와 같이 뜹니다.(오류난 위치를 알려주는 꺽쇠(^)표시는 parinfo=pi의 p밑에 위치합니다!)

    왜 이런 문제가 생기는지.. 알 수 있을까요?

    아니면.. 선형회귀를 할 때 y축을 0으로 강제시키는 다른 방법이 있는지 알 수 있을까요?..ㅠㅠㄹ

  • #5094

    Jonghyuk Yi
    회원

    되다가 안되다가 한다는 설명을 정확히 진단하기는 어렵습니다만, 경로 설정 문제로 생각됩니다.

    MPFIT 관련 라이브러리들을 모두 한 폴더에 풀어 놓고,

    IDL Workbench 메뉴에서 창(W) > 환경설정을 실행하면 환경설정 창이 열립니다.
    왼쪽 목록에서 IDL 항목을 펼치면 경로 라는 메뉴가 나옵니다. 이를 설정하고,
    아래에 추가 버튼을 이용해서
    MPFIT을 풀어놓은 폴더를 지정하세요.

    이후 적용버튼 누르고 확인 으로 나오면 될 것 같습니다.
    이 것의 의미는 이 설정 이후에 IDL은 함수나 프로시저 호출이 나오면 추가한 폴더에 해당 이름을 가진 프로시저나 함수가 있는지 확인하는 것입니다.

    문제는 현재로도 어떤 때는 된다는 것인데, 중복되는 루틴이 경로상에 있는 것은 별로 좋지는 않습니다. 중복하여 존재하지 않게 하나는 정리하시는 게 좋겠습니다. 아마도 어떤 작업 과정 중에 명시적으로 MPFIT 루틴들을 컴파일 하는 계기가 있을 것이고 이 이후에는 실행이 되다가, 세션 리셋이 되면 다시 실행이 안되는 그런 상황인 것 같습니다.

    pi[0].fixed=1
    pi[0].value=0.

    은 적절한 사용이라고 생각됩니다.

    저는 올려주신 코드 그대로 talh와 talc만 모의로 데이터를 만들어 실행했을 때 실행이 잘 됩니다. (컬러 체계는 저와 좀 다른 듯 하여 그 부분은 수정하였습니다).

    syntax error라고 나오는 이유는,
    저 프로그램을 돌릴 때, mpfitexpr 함수를 찾을 수 없음 -> 그러므로 mpfitexpr을 배열이라고 생각하고 배열식 접근을 시도 -> 그러나 배열의 인덱싱 체계에 맞지 않는 parinfo=pi 라는 구문이 나오므로, 문법 오류처리 하는 것입니다.

    이것이 과거의 문법을 그대로 계승하는 과정 중에 배열도 둥근괄호 ( ) 로, 함수도 둥근괄호 ( )로 접근할 수 있게 두다 보니 헷갈리게 되는 상황입니다.

    만일, 경로 설정이 안된 상태에서, 해당 프로그램의 서두에 compile_opt IDL2 또는 compile_opt strictarr 을 선언한다면. 같은 부분에서 syntax error 대신
    % Attempt to call undefined function: ‘MPFITEXPR’.
    이라는 에러를 발생합니다.
    compile_opt IDL2나 compile_opt strictarr은 배열은 사각괄호 [ ]만 허용, 함수는 둥근괄호 ( ) 만 허용하기 때문에, mpfitexpr을 처음부터 함수일 거라고 확정하고 문법적인 접근을 합니다. 그래서 “그런 함수 없어요”에 해당하는 에러를 바로 발생하게 됩니다.

    물론, 경로 설정만 제대로 된다면, 이런 문제는 없을 것입니다.

    이런 이유로 현대적인 IDL 프로그래밍 체계에서는 compile_opt IDL2를 강제 또는 강력히 권고함으로써 지금 겪으시는 혼선을 사전에 제거하려 노력하기도 합니다.

    아래 링크는 이에 대해 좀 더 자세히 설명하고 있습니다.
    http://blog.daum.net/swrush/146

답변은 로그인 후 가능합니다.