<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Let's Study Animal Breeding</title>
    <link>https://bhpark.tistory.com/</link>
    <description>population genetics, quantitative genetics, statistics, matrix algebra, computer programming and molecular biology</description>
    <language>ko</language>
    <pubDate>Thu, 20 Aug 2026 17:26:47 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>투정이</managingEditor>
    <item>
      <title>Newton-Raphson과 Average Information REML</title>
      <link>https://bhpark.tistory.com/291</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;log likelihood(이것에 대한 부연 설명 생략)를 이용하여 분산 성분을 추정하는 세 가지 방법 1) 미분 없이 derivative free 2) 1차 미분 EM-REMl 3) 2차 미분(AI-REML)&lt;br&gt;AI-REML 설명을 위하여 observed information matrix, expected information matrix 및 average information matrix를 이전 포스트에서 설명하였다. 여기서는 average information matrix(2차 미분)를 이용하여 분산 성분을 추정하는 과정과 그 과정에서 Newton-Raphson 이라는 방법이 동원되는데 그것에 대해서 간략히 설명한다.&lt;br&gt;먼저 Newton-Raphson 방법은 해를 풀어서 구하기 힘들 때 점근적으로 (여러 라운드에 걸쳐서) 해를 구하는 방법이다. 현재의 해(또는 초기값)를 Xn이라고 하고 다음 번 해를 Xn+1이라고 할 때 새로운 해를 구할 때(또는 갱신할 때) Newton-Raphson 방법을 이용한다는 뜻이다. 해가 여러 개인 다차원 문제는 그림으로 이해하기 어려우므로 해가 1개인 방정식(f(x))을 2차원적으로 이해해 보자. 초기 해(Xn 또는 X0)가 있을 때, 방정식의 y 즉 f(Xn)을 구한다. 점(Xn, f(Xn))은 방정식의 위 점이 된다. 이 점에서 이 방정식의 접선의 식을 구해보자. 그러러면 기울기가 필요한데 미분을 한 식에 Xn을 대입하면 된다. 미분한 식을 f'(X)라 하면 접선의 기울기는 f'(Xn)이 된다. 그러면 접선의 식은 y - f(Xn) = f'(Xn)(X - Xn)이 된다. 이 접선이 x 축과 만나는 점을 (Xn+1, 0)이라 하자. 이 점을 접선에 대입하면 0 - f(Xn) = f'(Xn)(Xn+1 - Xn)이 된다. 이것을 정리하면 Xn+1 = Xn - f(Xn)/f'(Xn) 이 된다. 이게 Newton-Raphson 식인데 설명을 하자면 현재값 Xn을 갱신하는 방법이 (현재 방정식 값)/(1차 미분 방정식 값)을 빼주는 방식이다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tnF5O/dJMcaihiDE3/8849mxq3oCjsSEYY9NC93k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tnF5O/dJMcaihiDE3/8849mxq3oCjsSEYY9NC93k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tnF5O/dJMcaihiDE3/8849mxq3oCjsSEYY9NC93k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtnF5O%2FdJMcaihiDE3%2F8849mxq3oCjsSEYY9NC93k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;933&quot; height=&quot;495&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위의 그림을 보면 만일 그래프가 뾰족하면 즉 접선의 기울기 절대값이 크면 갱신한 Xn+1이 그리 크게 변하지 않을 것이고, 그래프가 좀 완만하다면 즉 접선의 기울기 절대값이 작다면 갱신한 Xn+1이 크게 변한다는 것을 쉽게 알 수 있다. 그래서 AI-REML이 수렴값 근처에서 즉 점점 평평해 질 때 빠른 속으로 해에 더 가까워 진다는 것이고, EM-REML이 수렴의 방향만을 고려한다면 AI-REML은 방향뿐만 아니라 일종의 폭도 고려한다는 얘기다.&lt;br&gt;이제 다시 분산 성분 추정하는 문제로 돌아봐 보자. 우리가 1차 미분한 식을 0으로 놓고 해를 구한다고 했는데, 이렇게 된 해에 약간의 보정을 가하는 것이다. 즉 Newton-Raphson 방법을 동원하여 약간의 보정을 가하는 것이다. 그런데 위에서 Netwon-Raphson 방법을 이용하려면 미분을 해야하는데, 우리는 이미 1차 미분을 한 식을 이용하니, 여기에 한 번 더 미분 즉 2차 미분을 한 것이다. 위의 Newton-Raphson 식에서 f(Xn)이 1차 미분 log likelihood이고, f'(Xn)이 2차 미분 log likilihood, 즉 average information matrix이다. 그런데 위에서는 f(Xn)이나 f'(Xn+1)이 스칼라이므로 나누기를 했지만 우리가 다루는 분산 성분 추정에서는 스칼라가 아니라 vector이고 matrix가 된다. 다음과 같이 나누기가 아니라 벡터와 역행렬을 이용한 표기로 바뀐다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;267&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZOoCQ/dJMcajUOtS4/EiNk9HHrqoFLaU4MQJ3Lt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZOoCQ/dJMcajUOtS4/EiNk9HHrqoFLaU4MQJ3Lt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZOoCQ/dJMcajUOtS4/EiNk9HHrqoFLaU4MQJ3Lt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZOoCQ%2FdJMcajUOtS4%2FEiNk9HHrqoFLaU4MQJ3Lt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;267&quot; height=&quot;50&quot; data-origin-width=&quot;267&quot; data-origin-height=&quot;50&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;분산 성분 갱신 공식은 위와 같은데 세타는 t, t + 1번째 분산 성분 벡터, M은 average information matrix의 역행렬, d는 경사 벡터(gradient vector) 또는 스코어 함수(score function)으로 1차 미분한 값이다. d가 방향이라면 M은 방향의 크기라고 할 수 있다.&lt;br&gt;마땅한 예제가 없어 예를 들어 보일 수는 없으나 AI-REML&amp;nbsp; 방법은 다음과 같이 진행된다.&lt;br&gt;1) 초기값 설정&lt;br&gt;2) 육종가 추정(일종의 expectation)&lt;br&gt;3) 분산 성분 추정(일종의 maximization, 즉 여기까지는 EM-REML과 동일)&lt;br&gt;4) average information matrix 계산&lt;br&gt;5) Newton-Raphson 방법에 따라 분산 성분 업데이트&lt;br&gt;6) 수렴 여부 판단&lt;br&gt;이게 각 round 마다 벌어지는 일이다. 수렴이 되었으면 끝이지만 수렴이 안 되었으면 다시 육종가 추정스텝으로 간다. 수렴이 될 때까지 반복한다. 4번과 5번을 계산하느라 한 round의 시간은 길어지지만 전체적인 round가 줄어서 추정 시간이 준다는게 Gilmour 논문의 주장이다. 하나마나한 이야기지만 분석하는 형질의 수나, 모형의 복잡성에 달라질 것이다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Animal Breeding/REML Variance Component Estimation</category>
      <category>AI-REML</category>
      <category>average information matrix</category>
      <category>Newton-Raphson Method</category>
      <author>투정이</author>
      <guid isPermaLink="true">https://bhpark.tistory.com/291</guid>
      <comments>https://bhpark.tistory.com/291#entry291comment</comments>
      <pubDate>Thu, 30 Oct 2025 12:29:09 +0900</pubDate>
    </item>
    <item>
      <title>평균 정보 행렬(average information matrix, AI matrix)</title>
      <link>https://bhpark.tistory.com/290</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;observed information matrix(OI)와 expected information matrix(EI)를 이용하여 average information matrix를 만들 차례이다. 이름에 average가 들어가 있으므로 OI와 EI의 평균일 것이라 생각할 수 있다. 그러나 그렇지 않다. &lt;span&gt;Gilmour&lt;/span&gt;&lt;span&gt;의&lt;span&gt; Average Information REML An Efficient Algorithm for Variance Parameter Estimation in Linear Mixed Models &lt;/span&gt;논문에는 simplified average 라고 나와 있다. 이게 무슨 뜻이냐. trace는 계산하기 힘들므로 trace를 quadratic form(y'Qy)으로 대체(또는 근사?)한 후 평균을 구했다는 뜻이다. 그렇게 해야 계산도 빨라지고, positive semidefinite이 보장되어 계산이 된다는 뜻이다. 즉 빠르고 안정적으로 수렴하는 AI-REML 알고리즘을 구현할 수 있게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;Gilmour의 논문에 나오는 observed information matrix, expected information matrix 및 average information matrix는 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;803&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uD9fD/dJMcafdNR5f/IwGPzUYqVr4AJhDkHUAjZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uD9fD/dJMcafdNR5f/IwGPzUYqVr4AJhDkHUAjZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uD9fD/dJMcafdNR5f/IwGPzUYqVr4AJhDkHUAjZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuD9fD%2FdJMcafdNR5f%2FIwGPzUYqVr4AJhDkHUAjZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;982&quot; height=&quot;803&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;803&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;그리고 &lt;span&gt;Larry R. Schaeffer&lt;/span&gt;&lt;span&gt;의 &lt;span&gt;2008&lt;/span&gt;년도 &lt;span&gt;Animal Models and Estimation of Variance Components에는 다음과 같이 나온다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;840&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OE2QZ/dJMcahJssnS/a0ZK3eNK9zqk0WYrTNpDa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OE2QZ/dJMcahJssnS/a0ZK3eNK9zqk0WYrTNpDa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OE2QZ/dJMcahJssnS/a0ZK3eNK9zqk0WYrTNpDa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOE2QZ%2FdJMcahJssnS%2Fa0ZK3eNK9zqk0WYrTNpDa0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1130&quot; height=&quot;840&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;840&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;observed information matrix와 expected information matrix는 같은 것을 알 수 있으나, average information matrix는 약간 다름을 알 수 있다. 아마도 Schaeffer가 Gilmour의 논문을 인용하며 둘째 식에서 0.5 를 빼먹은 것으로 보인다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;비록 Schaeffer가 0.5를 빼먹었지만 여기서는 Schaeffer의 표기를 기준으로 simplified average를 구해 본다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[크기변환]derivation of average information matrix.jpg&quot; data-origin-width=&quot;2481&quot; data-origin-height=&quot;3507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sn8Ns/dJMcaeeTAv5/LqdPkDnD80esVNqWYdVgKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sn8Ns/dJMcaeeTAv5/LqdPkDnD80esVNqWYdVgKk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sn8Ns/dJMcaeeTAv5/LqdPkDnD80esVNqWYdVgKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsn8Ns%2FdJMcaeeTAv5%2FLqdPkDnD80esVNqWYdVgKk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2481&quot; height=&quot;3507&quot; data-filename=&quot;[크기변환]derivation of average information matrix.jpg&quot; data-origin-width=&quot;2481&quot; data-origin-height=&quot;3507&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;셋째 식만 진짜 average 이고 첫째와 둘째는 trace를 qudratic으로 근사하여 average를 간단하게 만든 식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Animal Breeding/REML Variance Component Estimation</category>
      <category>AI matrix</category>
      <category>average information matrix</category>
      <category>expected information matrix</category>
      <category>observed information matrix</category>
      <category>관측 정보 행렬</category>
      <category>기대 정보 행렬</category>
      <category>평균 정보 행렬</category>
      <author>투정이</author>
      <guid isPermaLink="true">https://bhpark.tistory.com/290</guid>
      <comments>https://bhpark.tistory.com/290#entry290comment</comments>
      <pubDate>Wed, 29 Oct 2025 16:02:54 +0900</pubDate>
    </item>
    <item>
      <title>기대 정보 행렬의 유도(derivation of expected information matrix)</title>
      <link>https://bhpark.tistory.com/289</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;이전 포스트에서 관측 정보 행렬을 유도했다. 이제 이 관측 정보 행렬의 기댓값인 기대 정보 행렬(expected information matrix)을 유도할 차례이다. 여기서 중요한 것은 quadratic form의 기댓값을 구하는 방법이 적용된다는 점이다. quadratic form은 y'Qy 형태 즉 스칼라 값을 만들어 내는 행렬의 곱의 형태이다. 이전 포스트에서도 설명을 했지만 다시 quadratic form의 기댓값을 구해보고, 관측 정보 행렬에 이 공식을 적용하여 기대 정보 행렬을 구해본다.&lt;br /&gt;Gilmour의 Average Information REML An Efficient Algorithm for Variance Parameter Estimation in Linear Mixed Models 논문에는 observed information matrix와 expected information matrix가 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XUU8P/dJMcaap1UxV/vn5xXeiKU4AXNWZ0PNUFUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XUU8P/dJMcaap1UxV/vn5xXeiKU4AXNWZ0PNUFUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XUU8P/dJMcaap1UxV/vn5xXeiKU4AXNWZ0PNUFUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXUU8P%2FdJMcaap1UxV%2Fvn5xXeiKU4AXNWZ0PNUFUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;935&quot; height=&quot;511&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리고 Larry R. Schaeffer의 2008년도 Animal Models and Estimation of Variance Components에는&amp;nbsp;observed information matrix 과 expected information matrix이 다음과 같이 나와 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;601&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R5bam/dJMcafLDMnG/DU9i7tdxVNM7BXTQuPSRG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R5bam/dJMcafLDMnG/DU9i7tdxVNM7BXTQuPSRG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R5bam/dJMcafLDMnG/DU9i7tdxVNM7BXTQuPSRG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR5bam%2FdJMcafLDMnG%2FDU9i7tdxVNM7BXTQuPSRG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;863&quot; height=&quot;601&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;601&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;br /&gt;표기법에 약간의 차이가 있을 뿐 같은 식이다. 여기서는 Schaeffer의 observed information matrix를 기댓값을 취하여 expected information matrix를 구해 본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2481&quot; data-origin-height=&quot;3507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qk2ZV/dJMcafSppSo/Hmk86yBvAcua7xVMvV2MVk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qk2ZV/dJMcafSppSo/Hmk86yBvAcua7xVMvV2MVk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qk2ZV/dJMcafSppSo/Hmk86yBvAcua7xVMvV2MVk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqk2ZV%2FdJMcafSppSo%2FHmk86yBvAcua7xVMvV2MVk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2481&quot; height=&quot;3507&quot; data-origin-width=&quot;2481&quot; data-origin-height=&quot;3507&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2481&quot; data-origin-height=&quot;3507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8KoPE/dJMcaaXRQRQ/kdX5mvZ8YXV64BpeHhbPXK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8KoPE/dJMcaaXRQRQ/kdX5mvZ8YXV64BpeHhbPXK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8KoPE/dJMcaaXRQRQ/kdX5mvZ8YXV64BpeHhbPXK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8KoPE%2FdJMcaaXRQRQ%2FkdX5mvZ8YXV64BpeHhbPXK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2481&quot; height=&quot;3507&quot; data-origin-width=&quot;2481&quot; data-origin-height=&quot;3507&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Animal Breeding/REML Variance Component Estimation</category>
      <category>2차 형식의 기댓값</category>
      <category>average information matrix</category>
      <category>expectation of quadratic forms</category>
      <category>expected information matrix</category>
      <category>observed information matrix</category>
      <category>관측 정보 행렬</category>
      <category>기대 정보 행렬</category>
      <category>평균 정보 행렬</category>
      <author>투정이</author>
      <guid isPermaLink="true">https://bhpark.tistory.com/289</guid>
      <comments>https://bhpark.tistory.com/289#entry289comment</comments>
      <pubDate>Wed, 29 Oct 2025 12:46:54 +0900</pubDate>
    </item>
    <item>
      <title>관측 정보 행렬의 유도(derivation of observed information matrix)</title>
      <link>https://bhpark.tistory.com/288</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;REML 방법으로 분산 성분을 추정하는 세 가지 방법이 있다고 하였다. 1) derivative free, 미분하지 않고 그냥 분산 성분 찾아내기 2) 1차 미분하여 0과 같다고 놓고 분산 성분 찾아내기 3) 2차 미분하여 분산 성분 찾아내기.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2차까지 미분하는 이유는 1차 미분한 식에서 식을 0으로 하는 분산 성분 값을 찾기가 힘들고, 추정한 분산 성분을 이용하여 다시 육종가를 구하고 하는데 많은 round를 필요로 한다는 것이다. 원래 likelihood에서 최대 값을 찾기 위하여 1차 미분을 하였다면, 1차 미분 식을 0으로 만드는 값을 빨리 찾기 위하여 2차 미분을 하는 것이다. (자세한 사항은 나중에)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서는 1차 미분한 식을 이용하여 2차 미분한 식을 유도해 보고자 한다. 미분 기호식만 쓴다면 2차 미분은 매우 간단하다. 그래서 &lt;span&gt;Johnson and Thomson&lt;/span&gt;&lt;span&gt;의&lt;span&gt; Restricted maximum likelihood estimation of variance components for univariate animal models using sparse matrix techniques and average information 논문에는 다음과 같이 1차 미분식과 2차 미분식이 간단히 나온다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CDmLu/dJMb9LDZXM4/JQbnYKD9PWKS2v1C9WUnKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CDmLu/dJMb9LDZXM4/JQbnYKD9PWKS2v1C9WUnKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CDmLu/dJMb9LDZXM4/JQbnYKD9PWKS2v1C9WUnKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCDmLu%2FdJMb9LDZXM4%2FJQbnYKD9PWKS2v1C9WUnKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;617&quot; height=&quot;297&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리고 Searle의 Variance Component라는 책에도 다음과 같이 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mWwRI/dJMb9jtSNpI/baw5kzKsJ7vCSERXn0vuEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mWwRI/dJMb9jtSNpI/baw5kzKsJ7vCSERXn0vuEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mWwRI/dJMb9jtSNpI/baw5kzKsJ7vCSERXn0vuEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmWwRI%2FdJMb9jtSNpI%2Fbaw5kzKsJ7vCSERXn0vuEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;940&quot; height=&quot;197&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그러나 계산을 위해서 경우를 나누어 보면 약간 복잡해 진다. 분산을 효과의 분산과 잔차의 분산으로 나누어 본다면 1) 효과의 분산 - 효과의 분산으로 미분 2) 효과의 분산 - 잔차 분산으로 미분 3) 잔차 분산 - 잔차 분산으로 미분하는 경우로 나누어 볼 수 있다. 그래서 &lt;span&gt;Gilmour&lt;/span&gt;&lt;span&gt;의&lt;span&gt; Average Information REML An Efficient Algorithm for Variance Parameter Estimation in Linear Mixed Models &lt;/span&gt;논문에서는 다음과 같이 2차 미분한 식을 다음과 같이 표현하고 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSeGnB/dJMb84DuDuZ/89KbgjusvuCuOZpAE2KFhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSeGnB/dJMb84DuDuZ/89KbgjusvuCuOZpAE2KFhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSeGnB/dJMb84DuDuZ/89KbgjusvuCuOZpAE2KFhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSeGnB%2FdJMb84DuDuZ%2F89KbgjusvuCuOZpAE2KFhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;940&quot; height=&quot;299&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;299&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리고 Larry Schaeffer의 Animal Model and Estimation of Variance Components 라는 책에서는 다음과 같이 표현하고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQPIvc/dJMb9M3YY0k/ONhuTgFoGH3ndXgqOTxhd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQPIvc/dJMb9M3YY0k/ONhuTgFoGH3ndXgqOTxhd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQPIvc/dJMb9M3YY0k/ONhuTgFoGH3ndXgqOTxhd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQPIvc%2FdJMb9M3YY0k%2FONhuTgFoGH3ndXgqOTxhd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;940&quot; height=&quot;335&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서는 2차 미분식을 추정해 보는데 역시나 용어가 어렵다. 1차 미분한 식을 R. A. Fisher가 사용한 용어를 따라 Scoring function 등으로 부른다고 했는데 2차 미분한 식도 이름이 있다. Hessian Matrix. 그렇다면 우리가 구하는 식을 2차 미분한 식이라고 하였는데 Hessian Matrix를 구하는 것인가? 그렇지 않다. 우리가 구하는 식은 Hessian Matrix에 &quot;-&quot; negative를 붙인 식인데 이것을 observed information matrix (관측 정보 행렬???)이라고 한다. 비슷한 이름이 많고 헷갈린다. observed information matrix는 expected informaion matrix를 구하고 observed information matrix와 expected information matrix의 평균인 average information matrix를 구하는 기초가 된다. 여기서 matrix라는 표현을 쓰는데 효과의 분산이 한 개이고, 잔차 분산이 있는 경우 행렬의 (1,1) 원소는 잔차 분산 - 잔차 분산으로 미분한 경우의 값, (1, 2) 원소는 잔차 분산 - 효과의 분산으로 미분한 경우의 값 (2, 2) 원소는 효과의 분산 - 효과의 분산으로 미분한 경우의 값이다. information matrix의 역행렬을 구해서 빠르게 likelihood를 1차 미분한 식을 0으로 만드는 값을 찾는 방법은 나중에 설명하기로 한다. 암튼 여기서는 위 그림의 식을 유도한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[크기변환]derivation of observed information matrix_01.jpg&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;1754&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coFG1J/dJMb89dJnkX/sduf1KYKhzznIgjpxHy6m0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coFG1J/dJMb89dJnkX/sduf1KYKhzznIgjpxHy6m0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coFG1J/dJMb89dJnkX/sduf1KYKhzznIgjpxHy6m0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoFG1J%2FdJMb89dJnkX%2Fsduf1KYKhzznIgjpxHy6m0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1240&quot; height=&quot;1754&quot; data-filename=&quot;[크기변환]derivation of observed information matrix_01.jpg&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;1754&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[크기변환]derivation of observed information matrix_02.jpg&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;1754&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BaRP2/dJMb9fdWQIL/3oTjY9clKeuV3iJ2lkeU5k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BaRP2/dJMb9fdWQIL/3oTjY9clKeuV3iJ2lkeU5k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BaRP2/dJMb9fdWQIL/3oTjY9clKeuV3iJ2lkeU5k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBaRP2%2FdJMb9fdWQIL%2F3oTjY9clKeuV3iJ2lkeU5k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1240&quot; height=&quot;1754&quot; data-filename=&quot;[크기변환]derivation of observed information matrix_02.jpg&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;1754&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[크기변환]derivation of observed information matrix_03.jpg&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;1754&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7gxkG/dJMb9QFi1cC/J3UgVKMYuHLBPJzxy5zst0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7gxkG/dJMb9QFi1cC/J3UgVKMYuHLBPJzxy5zst0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7gxkG/dJMb9QFi1cC/J3UgVKMYuHLBPJzxy5zst0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7gxkG%2FdJMb9QFi1cC%2FJ3UgVKMYuHLBPJzxy5zst0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1240&quot; height=&quot;1754&quot; data-filename=&quot;[크기변환]derivation of observed information matrix_03.jpg&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;1754&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[크기변환]derivation of observed information matrix_04.jpg&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;1754&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC0IfL/dJMb9OtXqtI/4iR9LadIYZp7Jxhx8KLz2K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC0IfL/dJMb9OtXqtI/4iR9LadIYZp7Jxhx8KLz2K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC0IfL/dJMb9OtXqtI/4iR9LadIYZp7Jxhx8KLz2K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC0IfL%2FdJMb9OtXqtI%2F4iR9LadIYZp7Jxhx8KLz2K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1240&quot; height=&quot;1754&quot; data-filename=&quot;[크기변환]derivation of observed information matrix_04.jpg&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;1754&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;notation의 약간의 차이가 있지만 암튼 유도를 마쳤다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Animal Breeding/REML Variance Component Estimation</category>
      <category>average information matrix</category>
      <category>expected information matrix</category>
      <category>Hessian</category>
      <category>observed information matrix</category>
      <category>restriced maximum likelihood</category>
      <category>second derivative</category>
      <author>투정이</author>
      <guid isPermaLink="true">https://bhpark.tistory.com/288</guid>
      <comments>https://bhpark.tistory.com/288#entry288comment</comments>
      <pubDate>Fri, 24 Oct 2025 11:12:43 +0900</pubDate>
    </item>
    <item>
      <title>REML log likelihood function을 미분하여 분산성분 추정하기(first derivatives of the natural log of the restricted likelihood function)</title>
      <link>https://bhpark.tistory.com/287</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;REML의 likelihood function을 이용하여 분산 성분을 추정하는 방법에는 세 가지가 있다고 하였다. 1) 미분하지 않고 2) 1차 미분하고 3) 2차 미분하고.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앞의 포스트는 미분하지 않고 분산 성분을 추정하는 방법에 대한 포스트 였고, 여기서는 미분을 하고 0으로 놓아, likelihood fucntion을 최대로 하는 분산값을 찾는 방법을 설명한다. 미분 자체는 매우 간단하다. determinant의 로그값의 미분이나, 역행렬의 미분에 대해서는 이미 앞선 글에서 설명한 바 있다. 미분이 문제가 아니라 미분한 식을 계산 가능한 식으로 변환하는 것이 문제다. Projection Matrix P가 장악을 한 공식인데 이게 매우 복잡하여 실제로 계산을 하기에 적당하지 않아서, 이것을 계산이 가능한 적당한 식으로 변환하는 것이 문제다. 암튼 여러 참고 문헌과 AI의 도움으로 유도를 하였다. 여러 참고 문헌 중 S. R. Searle의 Variance Component란 책이 많은 도움이 되었다. 대학원생이라면 한 번 보겠지만 지금은 엄두가 나지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;100년 전에 R. A. Fisher는 log-likelohood function을 1차 미분한 것을 score function이라고 하였다. &quot;추정량이 얼마나 잘 모수를 반영하는가&quot;를 점수(score)처럼 매겨 평가한다는 개념적 비유가 사용된 것이라고 한다. 그래서 지금부터 어디선가 score function이란 말을 들어도 당황하지 말아야 겠다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[크기변환]derivative_of_log_REML_01.jpg&quot; data-origin-width=&quot;2481&quot; data-origin-height=&quot;3507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cd3Ds4/btsQBwPkQBQ/YfXlgQdgDSXIZYiEKGmB5K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cd3Ds4/btsQBwPkQBQ/YfXlgQdgDSXIZYiEKGmB5K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cd3Ds4/btsQBwPkQBQ/YfXlgQdgDSXIZYiEKGmB5K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcd3Ds4%2FbtsQBwPkQBQ%2FYfXlgQdgDSXIZYiEKGmB5K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2481&quot; height=&quot;3507&quot; data-filename=&quot;[크기변환]derivative_of_log_REML_01.jpg&quot; data-origin-width=&quot;2481&quot; data-origin-height=&quot;3507&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[크기변환]derivative_of_log_REML_02.jpg&quot; data-origin-width=&quot;2481&quot; data-origin-height=&quot;3507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o7Hdx/btsQD0uSHbF/fAs1nMTyGbcZHoUT5FlKXk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o7Hdx/btsQD0uSHbF/fAs1nMTyGbcZHoUT5FlKXk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o7Hdx/btsQD0uSHbF/fAs1nMTyGbcZHoUT5FlKXk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo7Hdx%2FbtsQD0uSHbF%2FfAs1nMTyGbcZHoUT5FlKXk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2481&quot; height=&quot;3507&quot; data-filename=&quot;[크기변환]derivative_of_log_REML_02.jpg&quot; data-origin-width=&quot;2481&quot; data-origin-height=&quot;3507&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[크기변환]derivative_of_log_REML_03.jpg&quot; data-origin-width=&quot;2481&quot; data-origin-height=&quot;3507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YAjxJ/btsQElk22Qk/ZKxgFJiIPNeuVUtJA0OZM1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YAjxJ/btsQElk22Qk/ZKxgFJiIPNeuVUtJA0OZM1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YAjxJ/btsQElk22Qk/ZKxgFJiIPNeuVUtJA0OZM1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYAjxJ%2FbtsQElk22Qk%2FZKxgFJiIPNeuVUtJA0OZM1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2481&quot; height=&quot;3507&quot; data-filename=&quot;[크기변환]derivative_of_log_REML_03.jpg&quot; data-origin-width=&quot;2481&quot; data-origin-height=&quot;3507&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[크기변환]derivative_of_log_REML_04.jpg&quot; data-origin-width=&quot;2481&quot; data-origin-height=&quot;3507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GAll3/btsQElL6T5N/SKbGA5IQt4JNCKjUTwuLKK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GAll3/btsQElL6T5N/SKbGA5IQt4JNCKjUTwuLKK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GAll3/btsQElL6T5N/SKbGA5IQt4JNCKjUTwuLKK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGAll3%2FbtsQElL6T5N%2FSKbGA5IQt4JNCKjUTwuLKK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2481&quot; height=&quot;3507&quot; data-filename=&quot;[크기변환]derivative_of_log_REML_04.jpg&quot; data-origin-width=&quot;2481&quot; data-origin-height=&quot;3507&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[크기변환]derivative_of_log_REML_05.jpg&quot; data-origin-width=&quot;2481&quot; data-origin-height=&quot;3507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nYM03/btsQCsrWw7U/92fZjiwRjaN83tjSkquzrk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nYM03/btsQCsrWw7U/92fZjiwRjaN83tjSkquzrk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nYM03/btsQCsrWw7U/92fZjiwRjaN83tjSkquzrk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnYM03%2FbtsQCsrWw7U%2F92fZjiwRjaN83tjSkquzrk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2481&quot; height=&quot;3507&quot; data-filename=&quot;[크기변환]derivative_of_log_REML_05.jpg&quot; data-origin-width=&quot;2481&quot; data-origin-height=&quot;3507&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Expectation-Maximization Algorithm&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 전에도 이용했던 예제를 이용하여 간단히 분산 성분을 추정해 보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dfreml_example.PNG&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EEICk/btsQCxArcJX/xLV9pLzHXpfGVcKU7E2YF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EEICk/btsQCxArcJX/xLV9pLzHXpfGVcKU7E2YF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EEICk/btsQCxArcJX/xLV9pLzHXpfGVcKU7E2YF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEEICk%2FbtsQCxArcJX%2FxLV9pLzHXpfGVcKU7E2YF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;551&quot; data-filename=&quot;dfreml_example.PNG&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;90개의 자료를 이용하여 구성한 least squares equation이다. 고정효과 1개, 임의 효과 A와 B가 있으며, 고정 효과의 레벨 수(rank of X)는 2(r(X) = 2), 임의 효과의 A의 레벨 수는 3, 임의 효과 B의 레벨수는 4이다. 전체 관측치의 제곱합(total sum of squares)는 356,000이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;임의 효과 A의 분산비 초기값은 10, 임의 효과 B의 분산비 초기값은 5로 하여, 해를 구하고(expectation), 그 해를 기초로 likelihood function을 최대화 하는 분산 성분을 추정(maximization)한다. 그리고 구한 분산 성분을 기초로 분산비를 구한 후, expectation - maximization을 반복한다. 수렴 기준(convergence criteria)을 정하고, 수렴할 때까지 반복한다.&lt;/p&gt;
&lt;pre id=&quot;code_1758172102654&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# total sum of squares
yty = 356000
yty

# left hand side
lhs = matrix(c(
    50, 0, 5, 15, 30, 5, 10, 20, 15,
    0, 40, 5, 15, 20, 5, 10, 20, 5,
    5, 5, 10, 0, 0, 2, 3, 4, 1,
    15, 15, 0, 30, 0, 5, 7, 11, 7,
    30, 20, 0, 0, 50, 3, 10, 25, 12,
    5, 5, 2, 5, 3, 10, 0, 0, 0,
    10, 10, 3, 7, 10, 0, 20, 0, 0,
    20, 20, 4, 11, 25, 0, 0, 40, 0,
    15, 5, 1, 7, 12, 0, 0, 0, 20
), nrow = 9, byrow = TRUE)
lhs

# right hand side
rhs = matrix(c(3200, 2380, 580, 1860, 3140, 700, 1320, 2400, 1160), nrow = 9)
rhs

# variance ratio
# alpha_a = 40, alpha_b = 10 일 때
alpha_a = 10
alpha_b = 5

lhs2 = lhs

# 임의효과에 분산비 더하기
diag(lhs2)[3:5] = diag(lhs2)[3:5] + alpha_a
diag(lhs2)[6:9] = diag(lhs2)[6:9] + alpha_b

lhs2

# solution 구하기
C = solve(lhs2)
#sol = solve(lhs2, rhs)
sol = C %*% rhs
sol

# rank
N_rx = 88
N_rx

# y'XbZu
ytXbZu =  t(sol) %*% rhs 
ytXbZu


# trCaa
trCaa = sum(diag(C)[3:5])
trCaa

# trCbb
trCbb = sum(diag(C)[6:9])
trCbb

# sigma_e2 추정
sigma_e2 = (yty - ytXbZu ) / N_rx
sigma_e2

# sigma_A2 추정
sigma_A2 = (t(sol[3:5]) %*% sol[3:5] + trCaa * sigma_e2) / 3
sigma_A2

# sigma_B2 추정
sigma_B2 = (t(sol[6:9]) %*% sol[6:9] + trCbb * sigma_e2) / 4
sigma_B2

# new ratio
alpha_a2 = sigma_e2 / sigma_A2
alpha_a2

alpha_b2 = sigma_e2 / sigma_B2
alpha_b2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실행 결과&lt;/p&gt;
&lt;pre id=&quot;code_1758172384356&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; # total sum of squares
&amp;gt; yty = 356000
&amp;gt; yty
[1] 356000
&amp;gt; 
&amp;gt; # left hand side
&amp;gt; lhs = matrix(c(
+     50, 0, 5, 15, 30, 5, 10, 20, 15,
+     0, 40, 5, 15, 20, 5, 10, 20, 5,
+     5, 5, 10, 0, 0, 2, 3, 4, 1,
+     15, 15, 0, 30, 0, 5, 7, 11, 7,
+     30, 20, 0, 0, 50, 3, 10, 25, 12,
+     5, 5, 2, 5, 3, 10, 0, 0, 0,
+     10, 10, 3, 7, 10, 0, 20, 0, 0,
+     20, 20, 4, 11, 25, 0, 0, 40, 0,
+     15, 5, 1, 7, 12, 0, 0, 0, 20
+ ), nrow = 9, byrow = TRUE)
&amp;gt; lhs
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
 [1,]   50    0    5   15   30    5   10   20   15
 [2,]    0   40    5   15   20    5   10   20    5
 [3,]    5    5   10    0    0    2    3    4    1
 [4,]   15   15    0   30    0    5    7   11    7
 [5,]   30   20    0    0   50    3   10   25   12
 [6,]    5    5    2    5    3   10    0    0    0
 [7,]   10   10    3    7   10    0   20    0    0
 [8,]   20   20    4   11   25    0    0   40    0
 [9,]   15    5    1    7   12    0    0    0   20
&amp;gt; 
&amp;gt; # right hand side
&amp;gt; rhs = matrix(c(3200, 2380, 580, 1860, 3140, 700, 1320, 2400, 1160), nrow = 9)
&amp;gt; rhs
      [,1]
 [1,] 3200
 [2,] 2380
 [3,]  580
 [4,] 1860
 [5,] 3140
 [6,]  700
 [7,] 1320
 [8,] 2400
 [9,] 1160
&amp;gt; 
&amp;gt; # variance ratio
&amp;gt; # alpha_a = 40, alpha_b = 10 일 때
&amp;gt; alpha_a = 10
&amp;gt; alpha_b = 5
&amp;gt; 
&amp;gt; lhs2 = lhs
&amp;gt; 
&amp;gt; # 임의효과에 분산비 더하기
&amp;gt; diag(lhs2)[3:5] = diag(lhs2)[3:5] + alpha_a
&amp;gt; diag(lhs2)[6:9] = diag(lhs2)[6:9] + alpha_b
&amp;gt; 
&amp;gt; lhs2
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
 [1,]   50    0    5   15   30    5   10   20   15
 [2,]    0   40    5   15   20    5   10   20    5
 [3,]    5    5   20    0    0    2    3    4    1
 [4,]   15   15    0   40    0    5    7   11    7
 [5,]   30   20    0    0   60    3   10   25   12
 [6,]    5    5    2    5    3   15    0    0    0
 [7,]   10   10    3    7   10    0   25    0    0
 [8,]   20   20    4   11   25    0    0   45    0
 [9,]   15    5    1    7   12    0    0    0   25
&amp;gt; 
&amp;gt; # solution 구하기
&amp;gt; C = solve(lhs2)
&amp;gt; #sol = solve(lhs2, rhs)
&amp;gt; sol = C %*% rhs
&amp;gt; sol
            [,1]
 [1,] 64.6313096
 [2,] 59.4225059
 [3,] -2.1363094
 [4,]  0.4994633
 [5,]  1.6368461
 [6,]  5.1063791
 [7,]  2.6402428
 [8,] -2.6432515
 [9,] -5.1033704
&amp;gt; 
&amp;gt; # rank
&amp;gt; N_rx = 88
&amp;gt; N_rx
[1] 88
&amp;gt; 
&amp;gt; # y'XbZu
&amp;gt; ytXbZu =  t(sol) %*% rhs 
&amp;gt; ytXbZu
         [,1]
[1,] 347871.3
&amp;gt; 
&amp;gt; 
&amp;gt; # trCaa
&amp;gt; trCaa = sum(diag(C)[3:5])
&amp;gt; trCaa
[1] 0.1649312
&amp;gt; 
&amp;gt; # trCbb
&amp;gt; trCbb = sum(diag(C)[6:9])
&amp;gt; trCbb
[1] 0.3309886
&amp;gt; 
&amp;gt; # sigma_e2 추정
&amp;gt; sigma_e2 = (yty - ytXbZu ) / N_rx
&amp;gt; sigma_e2
         [,1]
[1,] 92.37198
&amp;gt; 
&amp;gt; # sigma_A2 추정
&amp;gt; sigma_A2 = (t(sol[3:5]) %*% sol[3:5] + trCaa * sigma_e2) / 3
&amp;gt; sigma_A2
         [,1]
[1,] 7.575855
&amp;gt; 
&amp;gt; # sigma_B2 추정
&amp;gt; sigma_B2 = (t(sol[6:9]) %*% sol[6:9] + trCbb * sigma_e2) / 4
&amp;gt; sigma_B2
         [,1]
[1,] 24.16281
&amp;gt; 
&amp;gt; # new ratio
&amp;gt; alpha_a2 = sigma_e2 / sigma_A2
&amp;gt; alpha_a2
         [,1]
[1,] 12.19294
&amp;gt; 
&amp;gt; alpha_b2 = sigma_e2 / sigma_B2
&amp;gt; alpha_b2
         [,1]
[1,] 3.822899&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;계속 반복하면 임의 효과 A의 분산비는 35.7558로, 임의 효과 B의 분산비는 3.0101로 수렴한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위에서는 분산 성분을 추정할 때 추정하려는 효과의 분산 공분산 행렬을 ZZ'로 가정을 했으나 가축 육종의 Animal Model에서는 A로 가정한다. A는 Numerator Relationship Matrix이다. 이것을 한국어로 혈연 계수 행렬로 번역을 하고 있으나 이는 사실과 다르다. 정확히는 혈연 계수의 분자의 행렬이다. A로부터 혈연 계수를 구하려면 off diagonal의 숫자에 두 개체의 근교 계수의 root 값으로 나누어 주어야 한다. 그러나 너무 말이 복잡하므로 그냥 혈연 계수 행렬로 번역을 하는데 정확히 알아두는게 좋을 것 같다. Animal Model에서 개체 효과의 분산 공분산 행렬을 A라고 하였으므로 그것을 반영한 분산 성분 추정이어야 한다. 위에서 잔차의 분산은 변함이 없고 오로지 개체의 효과만 약간의 수정이 있다. 만일 repeatabiliy model 일 경우 영구 환경 효과 P를 고려하는데 MME와 개체의 분산 성분 추정을 위한 식은 다음과 같아 진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHihkd/dJMcaawO2rD/Lz2ewgm1B9i9Yn47DClfR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHihkd/dJMcaawO2rD/Lz2ewgm1B9i9Yn47DClfR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHihkd/dJMcaawO2rD/Lz2ewgm1B9i9Yn47DClfR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHihkd%2FdJMcaawO2rD%2FLz2ewgm1B9i9Yn47DClfR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1026&quot; height=&quot;512&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;개체의 분산 성분을 추정할 때 A의 역행렬이 동원되는 것을 알 수 있다. 컴퓨팅 자원이 부족한 시절, A의 역행렬을 구하는 것은 매우 어려운 일이었다. 그런데 C. R. Henderson이 혈통을 보고 바로 A의 역행렬을 구하는 방법을 제시했다. MME를 제시하고, A의 역행렬을 바로 구할 수 있게 됨으로써 육종학의 새로운 지평이 열린 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Animal Breeding/REML Variance Component Estimation</category>
      <category>EM algorithm</category>
      <category>expectation</category>
      <category>first derivative</category>
      <category>inverse matrix</category>
      <category>log deternimant</category>
      <category>log likelihood function</category>
      <category>maximization</category>
      <category>REML</category>
      <category>score function</category>
      <category>variance component estimation</category>
      <author>투정이</author>
      <guid isPermaLink="true">https://bhpark.tistory.com/287</guid>
      <comments>https://bhpark.tistory.com/287#entry287comment</comments>
      <pubDate>Thu, 18 Sep 2025 09:39:48 +0900</pubDate>
    </item>
    <item>
      <title>Derivative Free REML - Simplex Method</title>
      <link>https://bhpark.tistory.com/286</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;이전 DFREML에서는 A의 분산비를 고정하고, B의 분산비를 찾고, 다시 B의 분산비를 고정하고 A의 분산비를 찾는 것을 계속 반복했다. Simplex method에서는 A와 B의 분산비를 동시에 수정해서 빠르게 우도함수를 최대화하는 A와 B의 분산비를 찾는다. 찾는 순서는 다음과 같다.&lt;br /&gt;Reflection 후에 Expansion, 채택, Contraction 또는 Shrink 한다. 무슨 말인지 하나씩 보자.&lt;br /&gt;먼저 A와 B의 분산비 하나를 고른다. 여기서는 12.1과 3.8을 골랐다. 그리고 3.8을 고정하고 12.1을 바꾸어 13.1로 하자. 즉 13.1과 3.8이다. 이제 12.1을 고정하고 3.8을 4.3으로 바꾸어 보자. 즉 12.1과 4.3이다. 이 세 개의 분산비 조합으로 시작을 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgEIxF/btsQc6ps6Pr/LDoHQlCjOohNyZgsGl6XH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgEIxF/btsQc6ps6Pr/LDoHQlCjOohNyZgsGl6XH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgEIxF/btsQc6ps6Pr/LDoHQlCjOohNyZgsGl6XH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgEIxF%2FbtsQc6ps6Pr%2FLDoHQlCjOohNyZgsGl6XH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;280&quot; height=&quot;135&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 이들의 L4를 구해 보자. L4를 구하는 방법은 이전 글에서 설명한 R코드를 이용한다. L4를 구하고 L4에 대해서 내림차순으로 정렬한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;377&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brKn6D/btsQeC8H5pN/k2m7cw7tsiTy7Alx8CInj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brKn6D/btsQeC8H5pN/k2m7cw7tsiTy7Alx8CInj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brKn6D/btsQeC8H5pN/k2m7cw7tsiTy7Alx8CInj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrKn6D%2FbtsQeC8H5pN%2Fk2m7cw7tsiTy7Alx8CInj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;377&quot; height=&quot;135&quot; data-origin-width=&quot;377&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3번이 제일 안 좋은 L4 결과 값을 보였으니 이걸 교체해야 한다. 이걸 Reflection이라고 부른다. 3번을 제외한 1번과 2번의 A와 B 값을 평균한다.&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;gt; theta_1 = c(12.1, 3.8)
&amp;gt; theta_2 = c(13.1, 3.8)
&amp;gt; theta_3 = c(12.1, 4.3)
&amp;gt; 
&amp;gt; # reflection
&amp;gt; theta_m = (theta_2 + theta_1) / 2
&amp;gt; theta_m
[1] 12.6&amp;nbsp;&amp;nbsp;3.8&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 다음 공식으로 4번째 A와 B 값을 구한다. r은 1로 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;272&quot; data-origin-height=&quot;43&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbNO8U/btsQb8H3DNK/JaWJkuRY4Cxjhf5XmafvhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbNO8U/btsQb8H3DNK/JaWJkuRY4Cxjhf5XmafvhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbNO8U/btsQb8H3DNK/JaWJkuRY4Cxjhf5XmafvhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbNO8U%2FbtsQb8H3DNK%2FJaWJkuRY4Cxjhf5XmafvhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;272&quot; height=&quot;43&quot; data-origin-width=&quot;272&quot; data-origin-height=&quot;43&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;gt; r = 1
&amp;gt; 
&amp;gt; theta_4 = theta_m + r * (theta_m - theta_3)
&amp;gt; theta_4
[1] 13.1&amp;nbsp;&amp;nbsp;3.3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 13.1과 3.3을 이용하여 L4를 구하고 다시 L4를 기준으로 내림차순 정렬한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDQgnK/btsQenxgtTa/igaKmz6RDq8S2or0guaHKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDQgnK/btsQenxgtTa/igaKmz6RDq8S2or0guaHKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDQgnK/btsQenxgtTa/igaKmz6RDq8S2or0guaHKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDQgnK%2FbtsQenxgtTa%2FigaKmz6RDq8S2or0guaHKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;382&quot; height=&quot;197&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4번 세트가 가장 좋은 L4 결과를 보였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zJEB6/btsQco43KYT/zaLcJQ6sxu1KbYVbseth9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zJEB6/btsQco43KYT/zaLcJQ6sxu1KbYVbseth9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zJEB6/btsQco43KYT/zaLcJQ6sxu1KbYVbseth9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzJEB6%2FbtsQco43KYT%2FzaLcJQ6sxu1KbYVbseth9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;337&quot; height=&quot;217&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;217&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그림으로 설명하면 r_w가 worst일 때 평균 g (centroid)를 구하고 reflection 한다.&lt;br /&gt;이렇게 reflection 해서 구한 세트가 가장 좋은 결과를 보이면 Expansion 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n92pC/btsQfaK41Pq/0htW6zZtaYKJnkUpScaxB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n92pC/btsQfaK41Pq/0htW6zZtaYKJnkUpScaxB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n92pC/btsQfaK41Pq/0htW6zZtaYKJnkUpScaxB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn92pC%2FbtsQfaK41Pq%2F0htW6zZtaYKJnkUpScaxB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;556&quot; height=&quot;227&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;227&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그림으로 설명하면 reflection 한 값이 best이면 확장한다는 뜻이다.&amp;nbsp;&lt;br /&gt;expansion 공식은 다음과 같다. E는 2로 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;257&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSbI3P/btsQdfUCyp2/K8iSUwCmqB1qAxwLLvXxTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSbI3P/btsQdfUCyp2/K8iSUwCmqB1qAxwLLvXxTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSbI3P/btsQdfUCyp2/K8iSUwCmqB1qAxwLLvXxTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSbI3P%2FbtsQdfUCyp2%2FK8iSUwCmqB1qAxwLLvXxTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;257&quot; height=&quot;45&quot; data-origin-width=&quot;257&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;gt; # theta_4가 가장 좋은 값이므로 expansion step
&amp;gt; E = 2
&amp;gt; 
&amp;gt; theta_5 = theta_m + E * (theta_4 - theta_m)
&amp;gt; theta_5
[1] 13.6&amp;nbsp;&amp;nbsp;2.8&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위에서 가장 안 좋은 세트인 1번 세트를 제외하고 5번 세트를 넣어, L4를 구하고 내림차순 정렬한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mWFCf/btsQd8UI1u7/dPplKThsNtZ3qbJ59ir1o1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mWFCf/btsQd8UI1u7/dPplKThsNtZ3qbJ59ir1o1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mWFCf/btsQd8UI1u7/dPplKThsNtZ3qbJ59ir1o1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmWFCf%2FbtsQd8UI1u7%2FdPplKThsNtZ3qbJ59ir1o1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;382&quot; height=&quot;227&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;227&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이것이 하나의 iteration이다. reflection한 후에 평가를 해서 expansion 했다.&lt;br /&gt;이제 다음 iteration을 시작한다. reflection. 2번 세트를 제외하고 5와 4번 세트를 평균하고 새로운 세트를 구한다.&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;gt; # Begin next iteration
&amp;gt; # reflection
&amp;gt; theta_m = (theta_5 + theta_4) / 2
&amp;gt; theta_m
[1] 13.35&amp;nbsp;&amp;nbsp;3.05
&amp;gt; 
&amp;gt; theta_6 = theta_m + r * (theta_m - theta_2)
&amp;gt; theta_6
[1] 13.6&amp;nbsp;&amp;nbsp;2.3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2번 세트를 제외하고, 6번 세트를 넣어 L4를 구하고, 내림차순으로 정렬한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnwK0q/btsQeEMh5TW/Z0pdLcU3Sl04FYQHaf4WKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnwK0q/btsQeEMh5TW/Z0pdLcU3Sl04FYQHaf4WKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnwK0q/btsQeEMh5TW/Z0pdLcU3Sl04FYQHaf4WKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnwK0q%2FbtsQeEMh5TW%2FZ0pdLcU3Sl04FYQHaf4WKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;383&quot; height=&quot;247&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;247&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;6번 세트의 L4 값이 가장 낮은 값을 보였다. 이때는 expansion이 아니라 contraction을 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eHuGTc/btsQb4Mu1ko/qeH5vE8Ng475WXklPSA2SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eHuGTc/btsQb4Mu1ko/qeH5vE8Ng475WXklPSA2SK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eHuGTc/btsQb4Mu1ko/qeH5vE8Ng475WXklPSA2SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeHuGTc%2FbtsQb4Mu1ko%2FqeH5vE8Ng475WXklPSA2SK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;382&quot; height=&quot;202&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그림으로 설명하면 reflection 한 값이 Worst가 되었으므로 centroid와 worst 값의 중간으로 간다.&lt;br /&gt;contraction 공식은 다음과 같으며 c = 0.5이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;253&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2ZOYD/btsQeEFxPa5/fKxY0zSScqF5DKzLlkJMAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2ZOYD/btsQeEFxPa5/fKxY0zSScqF5DKzLlkJMAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2ZOYD/btsQeEFxPa5/fKxY0zSScqF5DKzLlkJMAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2ZOYD%2FbtsQeEFxPa5%2FfKxY0zSScqF5DKzLlkJMAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;253&quot; height=&quot;45&quot; data-origin-width=&quot;253&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;gt; # theta_6가 중간 값과 최악의 값 사이에 있으므로 outside contraction step
&amp;gt; c = 0.5
&amp;gt; 
&amp;gt; theta_7 = theta_m + c * (theta_6 - theta_m)
&amp;gt; theta_7
[1] 13.475&amp;nbsp;&amp;nbsp;2.675&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;7번 세트를 이용하여 L4를 구하고 내림차순으로 정렬한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;380&quot; data-origin-height=&quot;285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/da0hvk/btsQb89cJ8E/xxKW8BKgomvYR4ZqmKcmE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/da0hvk/btsQb89cJ8E/xxKW8BKgomvYR4ZqmKcmE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/da0hvk/btsQb89cJ8E/xxKW8BKgomvYR4ZqmKcmE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fda0hvk%2FbtsQb89cJ8E%2FxxKW8BKgomvYR4ZqmKcmE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;380&quot; height=&quot;285&quot; data-origin-width=&quot;380&quot; data-origin-height=&quot;285&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;두 번째 iteration을 마쳤다.&amp;nbsp;&lt;br /&gt;새로운 iteration을 시작한다.&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;gt; # Begin next iteration
&amp;gt; # reflection
&amp;gt; theta_m = (theta_5 + theta_7) / 2
&amp;gt; theta_m
[1] 13.5375&amp;nbsp;&amp;nbsp;2.7375
&amp;gt; theta_8 = theta_m + r * (theta_m - theta_4)
&amp;gt; theta_8
[1] 13.975&amp;nbsp;&amp;nbsp;2.175&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;8번 세트를 넣어, L4를 구하고 내림차순으로 정렬한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;307&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s7KbR/btsQcnd0duP/otGJlNaGxtBiZgpep907Z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s7KbR/btsQcnd0duP/otGJlNaGxtBiZgpep907Z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s7KbR/btsQcnd0duP/otGJlNaGxtBiZgpep907Z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs7KbR%2FbtsQcnd0duP%2FotGJlNaGxtBiZgpep907Z1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;383&quot; height=&quot;307&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;307&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;8번 세트의 L4값이 5번 세트, 7번 세트 및 4번 세트의 L4 보다 작은 값이 나왔다. inside contraction을 한다. inside contraction은 다음과 같이 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brrKOL/btsQdP82kXp/WRJWZKoVJfuGddwehPsgQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brrKOL/btsQdP82kXp/WRJWZKoVJfuGddwehPsgQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brrKOL/btsQdP82kXp/WRJWZKoVJfuGddwehPsgQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrrKOL%2FbtsQdP82kXp%2FWRJWZKoVJfuGddwehPsgQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;451&quot; height=&quot;50&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;50&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;inside contraction이 실패할 경우 즉, 계속해서 새로운 L4값이 최악의 경우보다 낮을 경우 Shrink 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GrZn9/btsQgesE03K/V7qLemkG3H3RrvBkRMK6mK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GrZn9/btsQgesE03K/V7qLemkG3H3RrvBkRMK6mK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GrZn9/btsQgesE03K/V7qLemkG3H3RrvBkRMK6mK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGrZn9%2FbtsQgesE03K%2FV7qLemkG3H3RrvBkRMK6mK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;352&quot; height=&quot;212&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그림으로 설명하면 reflection (r_R) 해도 worst, contraction (r_C) 해도 worst 이면, Worst(r_W)와 Second(r_G)를 best(r_B) 로 당긴다.&lt;br /&gt;여기서는 실패했다고 가정하고 7번 세트와 8번 세트를 Shrink 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;285&quot; data-origin-height=&quot;52&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XlSmD/btsQd6WYrYP/fV7AQkn8Zf46K3EnPBJ3vK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XlSmD/btsQd6WYrYP/fV7AQkn8Zf46K3EnPBJ3vK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XlSmD/btsQd6WYrYP/fV7AQkn8Zf46K3EnPBJ3vK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXlSmD%2FbtsQd6WYrYP%2FfV7AQkn8Zf46K3EnPBJ3vK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;285&quot; height=&quot;52&quot; data-origin-width=&quot;285&quot; data-origin-height=&quot;52&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서 델타는 0.5로 한다. best는 5번 세트이다. 그래서 새로운 7번 세트와 8번 세트는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;gt; # theta_8이 최악의 값보다 작으므로 shrink step
&amp;gt; d = 0.5
&amp;gt; theta_7n = theta_5 + d * (theta_7 - theta_5)
&amp;gt; theta_7n
[1] 13.5375&amp;nbsp;&amp;nbsp;2.7375
&amp;gt; theta_8n = theta_5 + d * (theta_8 - theta_5)
&amp;gt; theta_8n
[1] 13.7875&amp;nbsp;&amp;nbsp;2.4875&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;br /&gt;이와 같은 방식으로 L4를 구해서 비교하고, 새로운 임의효과 A와 B의 분산비를 구하는 과정을 반복한다. 세 점이 같아지면 끝난다. Neder and Mead(1965)가 제시한 reflection, expansion and contraction 상수는 데이터셋에 맞게 수정할 수 있다. 이전의 설명과 마찬가지로 local maximum 일 수 있으므로, global maximum에 도달했다고 생각이 들 때까지, 새로운 starting point로 반복해 봐야 한다. 그리고 simplex method는 추정해야 할 parameter의 수가 많을 경우 잘 동작하지 않는다.&lt;br /&gt;참고)&lt;br /&gt;반사점 위치에 따른 다음 수행 단계&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: justify;&quot;&gt;best보다도 좋음&lt;/td&gt;
&lt;td style=&quot;text-align: justify;&quot;&gt;Expansion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: justify;&quot;&gt;best와 second-best 사이&lt;/td&gt;
&lt;td style=&quot;text-align: justify;&quot;&gt;채택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: justify;&quot;&gt;second-best와 worst 사이&lt;/td&gt;
&lt;td style=&quot;text-align: justify;&quot;&gt;Outside contraction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: justify;&quot;&gt;worst보다도 나쁨&lt;/td&gt;
&lt;td style=&quot;text-align: justify;&quot;&gt;Inside contraction (&amp;rarr; 실패 시 shrink)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>Animal Breeding/REML Variance Component Estimation</category>
      <category>contraction</category>
      <category>derivative free</category>
      <category>expansion</category>
      <category>global maximum</category>
      <category>L4</category>
      <category>local maximum</category>
      <category>Reflection</category>
      <category>REML</category>
      <category>shrink</category>
      <category>simplex</category>
      <author>투정이</author>
      <guid isPermaLink="true">https://bhpark.tistory.com/286</guid>
      <comments>https://bhpark.tistory.com/286#entry286comment</comments>
      <pubDate>Sat, 30 Aug 2025 11:59:01 +0900</pubDate>
    </item>
    <item>
      <title>Derivative Free REML(REstricted Maximum Likelihood)</title>
      <link>https://bhpark.tistory.com/285</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;REML의 우도함수를 최대화하는 분산을 찾는 방법에는 세 가지가 있다고 이전 글에서 얘기했다. 그 세 방법 중 첫째 방법인 Derivative Free 방법으로 분산을 찾는 방법에 대해서 알아 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Derivative Free라는 것은 미분을 하지 않는다는 것이다. ML의 우도함수를 미분해서 0과 같다고 한 후, 평균과 분산을 구하면 우도 함수를 최대(최소)화하는 것이라 했다. 그런데 미분을 하지 않고 어떻게 찾는다는 것인가? 이 값 저 값을 넣어봐서 최대가 되는지 보고 더 이상 최대가 안 되는 값을 우도 함수를 최대화하는 값이라 하겠다는 것이다. 수학이 꼭 뭘 풀어서 답을 찾는다고 생각할 수도 있지만 너무 복잡해서 풀기 힘들 때는 대충 넣어 보면서 구할 수도 있다. 진짜 최대화하는 값이 아닐 수도 있지만 적당히 비슷하면 세상의 문제를 푸는데 아무 문제가 없기 때문이다. 예를 들어 y = (x - 1)^2 을 최소화하는 x를 찾는다고 했을 때 -10 에서 +10 사이의 값을 대충 넣어 보면 0에서 2 사이에서 최소화되는 것을 알 수 있다. 그러면 범위를 좀 더 좁혀서 0에서 2 사이의 값 10개 정도를 넣어 봐서 범위를 줄이고, 이거를 계속 반복하면 1 또는 1 근처의 값을 구할 수 있다. 물론 이렇게 막무가내로 하지는 않겠지만, 대충 이 값 저 값을 넣어서 원하는 값을 빨리 찾는 법은 많은 수학자들이 수 많은 방법을 연구했다. (대학교때 배운 것도 같지만 나는 잘 모른다.) 암튼 그렇다. 뒤에 예제를 보면 이해가 간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우도 함수의 여러 가지 변형 형태에 대해서 얘기했었다. 우도함수의 마지막 항 y'K'(K'VK)-1K'y = y'Py = (y - Xb^)' V-1 ( y - Xb^) 임을 설명하였다. 여기서는 또 다른 변형 형태에 대해서 설명하고 어떻게 적용하는지 알아보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dfreml_yPy.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5sQ3p/btsQadnSDzZ/drjNh6ouiL3WCFJyynjLE1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5sQ3p/btsQadnSDzZ/drjNh6ouiL3WCFJyynjLE1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5sQ3p/btsQadnSDzZ/drjNh6ouiL3WCFJyynjLE1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5sQ3p%2FbtsQadnSDzZ%2FdrjNh6ouiL3WCFJyynjLE1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4962&quot; height=&quot;7014&quot; data-filename=&quot;dfreml_yPy.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 다음 예제를 보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dfreml_example.PNG&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqMDBf/btsP88gjXGt/KZ458O536rbKCVnLdwpHKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqMDBf/btsP88gjXGt/KZ458O536rbKCVnLdwpHKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqMDBf/btsP88gjXGt/KZ458O536rbKCVnLdwpHKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqMDBf%2FbtsP88gjXGt%2FKZ458O536rbKCVnLdwpHKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;551&quot; data-filename=&quot;dfreml_example.PNG&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;F는 고정효과이고, A와 B는 임의효과이다. A와 B의 분산을 구해야 한다. A와 B의 분산 값으로 여러 가지 값을 넣어 봐서 어떤 값이 우도함수를 최대화하는지 보면 되는데, 동시에 2개를 처리하려면 경우의 가짓수가 너무 많아지므로 먼저 B의 분산을 고정하고 고정된 B 값에서 어떤 A가 우도함수를 최대화하는지 찾아볼 것이다. 예상했듯이 A가 나오면 구한 A 값으로 고정하고 B의 값을 이 값 저 값을 넣어 봐서 우도함수를 최대화하는 B를 찾는다. 다시 B를 고정하고 A를 찾는다. 이걸 계속 반복해서 안정화될 때까지 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서는 분산 값을 찾지 않고 분산비를 찾을 텐데, 잔차 분산을 구하므로 마지막에 각 효과의 분산도 구할 수 있다. 임의 효과 B의 분산비를 10으로 고정하고, 임의 효과 A의 분산비가 5, 10, 20, 30, 40일 때의 우도 값을 구하면 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dfreml_example_2.PNG&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOZGkv/btsQaVmTHHU/jzpbcB1UNuX0GX1W6lvJe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOZGkv/btsQaVmTHHU/jzpbcB1UNuX0GX1W6lvJe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOZGkv/btsQaVmTHHU/jzpbcB1UNuX0GX1W6lvJe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOZGkv%2FbtsQaVmTHHU%2FjzpbcB1UNuX0GX1W6lvJe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1044&quot; height=&quot;365&quot; data-filename=&quot;dfreml_example_2.PNG&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;365&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서는 A의 분산비가 40일 때 우도함수값을 구하는 과정을 설명한다. 그러면 나머지는 알아서 구할 수 있을 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1756347007261&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# total sum of squares
yty = 356000
yty

# left hand side
lhs = matrix(c(
    50, 0, 5, 15, 30, 5, 10, 20, 15,
    0, 40, 5, 15, 20, 5, 10, 20, 5,
    5, 5, 10, 0, 0, 2, 3, 4, 1,
    15, 15, 0, 30, 0, 5, 7, 11, 7,
    30, 20, 0, 0, 50, 3, 10, 25, 12,
    5, 5, 2, 5, 3, 10, 0, 0, 0,
    10, 10, 3, 7, 10, 0, 20, 0, 0,
    20, 20, 4, 11, 25, 0, 0, 40, 0,
    15, 5, 1, 7, 12, 0, 0, 0, 20
), nrow = 9, byrow = TRUE)
lhs

# right hand side
rhs = matrix(c(3200, 2380, 580, 1860, 3140, 700, 1320, 2400, 1160), nrow = 9)
rhs

# variance ratio
# alpha_a = 40, alpha_b = 10 일 때, L4 구하기 
alpha_a = 40
alpha_b = 10

lhs2 = lhs

# 임의효과에 분산비 더하기
diag(lhs2)[3:5] = diag(lhs2)[3:5] + alpha_a
diag(lhs2)[6:9] = diag(lhs2)[6:9] + alpha_b

lhs2

# solution 구하기
sol = solve(lhs2, rhs)
sol

# rank
N_rx = 88
N_rx

# 잔차 분산 구하기
sigma_e2 = (yty - t(sol) %*% rhs ) / N_rx
sigma_e2

# 잔차 분산 로그값
log_se2 = log(sigma_e2)
log_se2

# y'Py
ytPy = (yty - t(sol) %*% rhs ) / sigma_e2
ytPy

# log of determinant of C*
logC = log(det(lhs2))
logC

# levels of random effect a
q_a = 3
q_a

# no. X log of alpha_a
qlog_a = q_a * log(alpha_a)
qlog_a

# levels of random effect b 
q_b = 4

# no. X log of alpha_b
qlog_b = q_b * log(alpha_b)
qlog_b

# 최종 log likelihood
L4 = -0.5 * (N_rx * log_se2 - qlog_a - qlog_b + logC + ytPy)
L4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실행 결과&lt;/p&gt;
&lt;pre id=&quot;code_1756347044103&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; # total sum of squares
&amp;gt; yty = 356000
&amp;gt; yty
[1] 356000
&amp;gt; 
&amp;gt; # left hand side
&amp;gt; lhs = matrix(c(
+     50, 0, 5, 15, 30, 5, 10, 20, 15,
+     0, 40, 5, 15, 20, 5, 10, 20, 5,
+     5, 5, 10, 0, 0, 2, 3, 4, 1,
+     15, 15, 0, 30, 0, 5, 7, 11, 7,
+     30, 20, 0, 0, 50, 3, 10, 25, 12,
+     5, 5, 2, 5, 3, 10, 0, 0, 0,
+     10, 10, 3, 7, 10, 0, 20, 0, 0,
+     20, 20, 4, 11, 25, 0, 0, 40, 0,
+     15, 5, 1, 7, 12, 0, 0, 0, 20
+ ), nrow = 9, byrow = TRUE)
&amp;gt; lhs
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
 [1,]   50    0    5   15   30    5   10   20   15
 [2,]    0   40    5   15   20    5   10   20    5
 [3,]    5    5   10    0    0    2    3    4    1
 [4,]   15   15    0   30    0    5    7   11    7
 [5,]   30   20    0    0   50    3   10   25   12
 [6,]    5    5    2    5    3   10    0    0    0
 [7,]   10   10    3    7   10    0   20    0    0
 [8,]   20   20    4   11   25    0    0   40    0
 [9,]   15    5    1    7   12    0    0    0   20
&amp;gt; 
&amp;gt; # right hand side
&amp;gt; rhs = matrix(c(3200, 2380, 580, 1860, 3140, 700, 1320, 2400, 1160), nrow = 9)
&amp;gt; rhs
      [,1]
 [1,] 3200
 [2,] 2380
 [3,]  580
 [4,] 1860
 [5,] 3140
 [6,]  700
 [7,] 1320
 [8,] 2400
 [9,] 1160
&amp;gt; 
&amp;gt; # variance ratio
&amp;gt; # alpha_a = 40, alpha_b = 10 일 때, L4 구하기 
&amp;gt; alpha_a = 40
&amp;gt; alpha_b = 10
&amp;gt; 
&amp;gt; lhs2 = lhs
&amp;gt; 
&amp;gt; # 임의효과에 분산비 더하기
&amp;gt; diag(lhs2)[3:5] = diag(lhs2)[3:5] + alpha_a
&amp;gt; diag(lhs2)[6:9] = diag(lhs2)[6:9] + alpha_b
&amp;gt; 
&amp;gt; lhs2
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
 [1,]   50    0    5   15   30    5   10   20   15
 [2,]    0   40    5   15   20    5   10   20    5
 [3,]    5    5   50    0    0    2    3    4    1
 [4,]   15   15    0   70    0    5    7   11    7
 [5,]   30   20    0    0   90    3   10   25   12
 [6,]    5    5    2    5    3   20    0    0    0
 [7,]   10   10    3    7   10    0   30    0    0
 [8,]   20   20    4   11   25    0    0   50    0
 [9,]   15    5    1    7   12    0    0    0   30
&amp;gt; 
&amp;gt; # solution 구하기
&amp;gt; sol = solve(lhs2, rhs)
&amp;gt; sol
            [,1]
 [1,] 64.8006682
 [2,] 59.6949940
 [3,] -0.8899764
 [4,]  0.1250204
 [5,]  0.7649560
 [6,]  3.8190836
 [7,]  2.3062868
 [8,] -2.1370493
 [9,] -3.9883211
&amp;gt; 
&amp;gt; # rank
&amp;gt; N_rx = 88
&amp;gt; N_rx
[1] 88
&amp;gt; 
&amp;gt; # 잔차 분산 구하기
&amp;gt; sigma_e2 = (yty - t(sol) %*% rhs ) / N_rx
&amp;gt; sigma_e2
         [,1]
[1,] 96.39973
&amp;gt; 
&amp;gt; # 잔차 분산 로그값
&amp;gt; log_se2 = log(sigma_e2)
&amp;gt; log_se2
         [,1]
[1,] 4.568503
&amp;gt; 
&amp;gt; # y'Py
&amp;gt; ytPy = (yty - t(sol) %*% rhs ) / sigma_e2
&amp;gt; ytPy
     [,1]
[1,]   88
&amp;gt; 
&amp;gt; # log of determinant of C*
&amp;gt; logC = log(det(lhs2))
&amp;gt; logC
[1] 32.05245
&amp;gt; 
&amp;gt; # levels of random effect a
&amp;gt; q_a = 3
&amp;gt; q_a
[1] 3
&amp;gt; 
&amp;gt; # no. X log of alpha_a
&amp;gt; qlog_a = q_a * log(alpha_a)
&amp;gt; qlog_a
[1] 11.06664
&amp;gt; 
&amp;gt; # levels of random effect b 
&amp;gt; q_b = 4
&amp;gt; 
&amp;gt; # no. X log of alpha_b
&amp;gt; qlog_b = q_b * log(alpha_b)
&amp;gt; qlog_b
[1] 9.21034
&amp;gt; 
&amp;gt; # 최종 log likelihood
&amp;gt; L4 = -0.5 * (N_rx * log_se2 - qlog_a - qlog_b + logC + ytPy)
&amp;gt; L4
          [,1]
[1,] -250.9019&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이렇게 임의효과 A의 값이 5, 10, 20, 30, 40일 때의 우도함수값을 구하였는데 과연 A값이 얼마일 때 우도함수가 최대가 되는 것일까? 이걸 알려면 2차항 회귀분석을 하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1756347186310&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# alpha_b = 10으로 고정하고
# alpha_a가 5, 10, 20, 30, 40일 때의 L4
# L4를 최대화하는 alpha_a 구하기
# 2차 회귀 곡선으로 적합
Q = matrix(c(
    1, 5, 25,
    1, 10, 100,
    1, 20, 400,
    1, 30, 900,
    1, 40, 1600
), nrow = 5, byrow = TRUE)
Q

Y = matrix(c(
    -251.4442, 
    -251.1504, 
    -250.9822, 
    -250.9274, 
    -250.9019
    ), nrow = 5)
Y

beta = solve(t(Q) %*% Q, t(Q) %*% Y)
beta

m_alpha_a = - (beta[2] / (2 * beta[3]))
m_alpha_a&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실행 결과&lt;/p&gt;
&lt;pre id=&quot;code_1756347215496&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; # alpha_b = 10으로 고정하고
&amp;gt; # alpha_a가 5, 10, 20, 30, 40일 때의 L4
&amp;gt; # L4를 최대화하는 alpha_a 구하기
&amp;gt; # 2차 회귀 곡선으로 적합
&amp;gt; Q = matrix(c(
+     1, 5, 25,
+     1, 10, 100,
+     1, 20, 400,
+     1, 30, 900,
+     1, 40, 1600
+ ), nrow = 5, byrow = TRUE)
&amp;gt; Q
     [,1] [,2] [,3]
[1,]    1    5   25
[2,]    1   10  100
[3,]    1   20  400
[4,]    1   30  900
[5,]    1   40 1600
&amp;gt; 
&amp;gt; Y = matrix(c(
+     -251.4442, 
+     -251.1504, 
+     -250.9822, 
+     -250.9274, 
+     -250.9019
+     ), nrow = 5)
&amp;gt; Y
          [,1]
[1,] -251.4442
[2,] -251.1504
[3,] -250.9822
[4,] -250.9274
[5,] -250.9019
&amp;gt; 
&amp;gt; beta = solve(t(Q) %*% Q, t(Q) %*% Y)
&amp;gt; beta
              [,1]
[1,] -2.516015e+02
[2,]  4.488460e-02
[3,] -6.979310e-04
&amp;gt; 
&amp;gt; m_alpha_a = - (beta[2] / (2 * beta[3]))
&amp;gt; m_alpha_a
[1] 32.15547&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;즉 B의 분산비가 10일 때 우도함수를 간단히 다음과 같은 2차 함수로 나타낼 수 있다는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;y = -0.000697931 x^2 + 0.0448846 x - 251.6015, 여기서 x는 임의효과 A의 분산비&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 2차 함수를 최대화하는 x는 - B/ 2A 이므로 0.0448846 / (2 * 0.000697931) = 32.15547 이 된다. 이제 임의효과 A의 분산비를 32.15547로 고정하고, 임의 효과 B의 값을 2, 3, 4, ..., 10로 바꾸어 가며 우도함수 값을 구하고 위와 같이 2차항 회귀분석을 하여 임의 효과 B의 값을 정한다. 다시 A의 값을 32 전후로 바꾸어 가며 A 값을 바꾼다. 이때 점점 값 사이의 간격이 작아질 것이고 결국 어떤 수준 이하로 수렴할 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그런데 여기서 우리가 구한 값이 global maximum이란 보장이 없다. 여러 개의 산이 있는데 비교적 높이가 낮은 산 근처에서 시작을 해서 눈 감고 찾다 보니 높이가 낮은 산의 높이를 구할 수도 있다. 이걸 local maximum이라 한다. 암튼 전체 구역에서 최고의 높이를 보이는 산을 찾으려면 여러번 여러 군데에서 시작을 해야 한다. 그래도 결과가 같게 나오면 그걸 global maximum이라 인정한다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Animal Breeding/REML Variance Component Estimation</category>
      <category>derivative free</category>
      <category>global maximum</category>
      <category>local maximum</category>
      <category>restricted maximum likelihood</category>
      <category>variance component estimation</category>
      <author>투정이</author>
      <guid isPermaLink="true">https://bhpark.tistory.com/285</guid>
      <comments>https://bhpark.tistory.com/285#entry285comment</comments>
      <pubDate>Thu, 28 Aug 2025 11:31:37 +0900</pubDate>
    </item>
    <item>
      <title>Log Likelihood Function of REML(restricted maximum likelihood)</title>
      <link>https://bhpark.tistory.com/284</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;지난 글에서 ML의 log likelihood function에 대해서 살펴봤다. 이제 REML의 log likelihood function에 대해서 살펴볼 차례이다. ML과 REML. 이렇게 보면 ML이 나오고 REML이 나온 것이겠지 하겠지만, AI에게 물보면 그런 것 같지 않다. 이제와서 이해하기에 ML 이해하고, REML 이해하는 것이 편한 것 같아서 그렇게 공부하지만 역사적으로는 그런 것 같지 않다. ML과 REML의 역사에 대해서는 AI에 물어보시길.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ML과 REML의 차이점은 고정 효과를 추정할 때 감소한 자유도를 고려하느냐이다. REML에서는 고정효과의 영향을 제거하기 위하여 K'X = 0 을 만족시키는 K'를 이용하여 K'y를 만들고 이에 대한 likelihood function을 만드는 것으로 시작한다. 중간에 수식을 전개하는 데 필요한 설명은 이전 글에서 설명한 적이 있고, 간단한 수식은 이번 글에서 설명했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;reml_log_likelihood_function_01.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7u3A6/btsP5pvwoTe/34VKcnIaatqwzVkfVmnlIK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7u3A6/btsP5pvwoTe/34VKcnIaatqwzVkfVmnlIK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7u3A6/btsP5pvwoTe/34VKcnIaatqwzVkfVmnlIK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7u3A6%2FbtsP5pvwoTe%2F34VKcnIaatqwzVkfVmnlIK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4962&quot; height=&quot;7014&quot; data-filename=&quot;reml_log_likelihood_function_01.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;reml_log_likelihood_function_02.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lUklO/btsP5GwScXS/7XNxe8v2OEes284v55bock/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lUklO/btsP5GwScXS/7XNxe8v2OEes284v55bock/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lUklO/btsP5GwScXS/7XNxe8v2OEes284v55bock/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlUklO%2FbtsP5GwScXS%2F7XNxe8v2OEes284v55bock%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4962&quot; height=&quot;7014&quot; data-filename=&quot;reml_log_likelihood_function_02.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;reml_log_likelihood_function_03.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tOQWW/btsP5LLOaoR/tSHTjKaaNR9N5GS0AlVwJ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tOQWW/btsP5LLOaoR/tSHTjKaaNR9N5GS0AlVwJ0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tOQWW/btsP5LLOaoR/tSHTjKaaNR9N5GS0AlVwJ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtOQWW%2FbtsP5LLOaoR%2FtSHTjKaaNR9N5GS0AlVwJ0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4962&quot; height=&quot;7014&quot; data-filename=&quot;reml_log_likelihood_function_03.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다양한 변형의 우도 함수가 있음을 알 수 있다. 이 우도 함수를 최대화하는 분산 성분을 찾는 것이 목적이다. 우도 함수를 최대화하는 분산 성분을 찾는 방법에는 세 가지가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1) Derivative Free approach : 그냥 이 분산 성분 값, 저 분산 성분 값을 넣어 보면서 우도 함수가 최대가 되는지 살펴 보고, 더 이상 최대가 되는 분산 성분 값이 없을 때까지 찾는다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2) First Derivatives and EM : ML 에서와 마찬가지로 b와 분산 성분에 대해서 미분을 하고, 0과 같다고 놓는다. 미분한 수식을 0으로 만드는 b와 분산 성분값을 찾는다. 여기서 한 방에 찾아지지 않으므로 구한 분산 성분으로 다시 육종가를 구하고, 다시 분산 성분을 구하는 과정을 반복해서 값이 변하지 않을때까지 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3) Second Derivatives : 2차 미분. observed information matrix를 포함하는 Newton-Raphson과 expected information matrix를 포함하는 Fishers Method of Scoring 이용. observed 와 expected information matrix의 평균을 이용하는 average information algorithm을 이용하여 계산을 줄일 수 있다.(잘 이해가 안감. 나중에 이해하면 이해할 수 있는 언어로 다시 설명)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Animal Breeding/REML Variance Component Estimation</category>
      <category>log likelihood function</category>
      <category>miximization</category>
      <category>REML</category>
      <category>restriced maximun likelihood</category>
      <category>variance component</category>
      <category>분산 성분</category>
      <category>우도 함수</category>
      <category>최대화</category>
      <author>투정이</author>
      <guid isPermaLink="true">https://bhpark.tistory.com/284</guid>
      <comments>https://bhpark.tistory.com/284#entry284comment</comments>
      <pubDate>Mon, 25 Aug 2025 14:33:50 +0900</pubDate>
    </item>
    <item>
      <title>ln|K'VK|, log of determinant of K'VK, K(K'VK)-1K' = P</title>
      <link>https://bhpark.tistory.com/283</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;Maximun Likelihood 방법으로 분산 성분을 추정할 경우 고정 효과를 추정할 때 감소한 자유도를 고려하지 못한다는 단점이 있다. 그래서 고정 효과를 추정할 때 감소한 자유도를 고려한 방법이 REML(Restricted Maximun Likelihood or Residual Maximum Likelihood)이다. K'X = 0 을 만족시키는 K'에 대하여 K'y의 multivariate normal distribution likelihood function의 이용하는 점이 다른 점이다. 여기서 K'의 rank는 N - r(X) 이다. y의 우도 함수를 구했으므로 K'y의 우도 함수 또한 어렵지 않게 구할 수 있다. 그러나 K'y의 우도 함수를 약간 변형할 때 필요한 식이 있다. 바로 K'y의 분산-공분산 행렬 K'VK이다. 여기서는 K'VK의 행렬식의 로그값이 어떻게 변하는지 살펴보고, K'y의 분산-공부산 행렬의 역행렬의 앞뒤에 K를 곱한 행렬이 Projection Matrix가 됨을 설명한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;REML_Likelihood_K'VK_yPy_01.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buv0FI/btsP0vvqSmW/8vskL4mVixpe1Kw3x2TGwk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buv0FI/btsP0vvqSmW/8vskL4mVixpe1Kw3x2TGwk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buv0FI/btsP0vvqSmW/8vskL4mVixpe1Kw3x2TGwk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbuv0FI%2FbtsP0vvqSmW%2F8vskL4mVixpe1Kw3x2TGwk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4962&quot; height=&quot;7014&quot; data-filename=&quot;REML_Likelihood_K'VK_yPy_01.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;REML_Likelihood_K'VK_yPy_02.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rPBtZ/btsP0Vgi3Gh/WNFD2wCcYeLGLSn2KKaonK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rPBtZ/btsP0Vgi3Gh/WNFD2wCcYeLGLSn2KKaonK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rPBtZ/btsP0Vgi3Gh/WNFD2wCcYeLGLSn2KKaonK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrPBtZ%2FbtsP0Vgi3Gh%2FWNFD2wCcYeLGLSn2KKaonK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4962&quot; height=&quot;7014&quot; data-filename=&quot;REML_Likelihood_K'VK_yPy_02.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;REML_Likelihood_K'VK_yPy_03.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cozKl8/btsPYLzhGw6/0Mbs3tF649uP2od7IYTpZ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cozKl8/btsPYLzhGw6/0Mbs3tF649uP2od7IYTpZ0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cozKl8/btsPYLzhGw6/0Mbs3tF649uP2od7IYTpZ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcozKl8%2FbtsPYLzhGw6%2F0Mbs3tF649uP2od7IYTpZ0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4962&quot; height=&quot;7014&quot; data-filename=&quot;REML_Likelihood_K'VK_yPy_03.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;REML_Likelihood_K'VK_yPy_04.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGWXtj/btsP0jommFL/LCtuBFQNjFs2kwmdjSQqx1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGWXtj/btsP0jommFL/LCtuBFQNjFs2kwmdjSQqx1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGWXtj/btsP0jommFL/LCtuBFQNjFs2kwmdjSQqx1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGWXtj%2FbtsP0jommFL%2FLCtuBFQNjFs2kwmdjSQqx1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4962&quot; height=&quot;7014&quot; data-filename=&quot;REML_Likelihood_K'VK_yPy_04.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고) Essential formulae for restricted maximum likelihood and its derivatives associated with the linear mixed models. Shengxin Zhu, Andrew J wathen.&lt;/p&gt;</description>
      <category>Animal Breeding/REML Variance Component Estimation</category>
      <category>determinant</category>
      <category>K'VK</category>
      <category>K'y</category>
      <category>K'y의 분산-공분산 행렬</category>
      <category>Projection Matrix</category>
      <category>REML</category>
      <category>residual maximum likelihood</category>
      <category>restricted maximum likelihood</category>
      <author>투정이</author>
      <guid isPermaLink="true">https://bhpark.tistory.com/283</guid>
      <comments>https://bhpark.tistory.com/283#entry283comment</comments>
      <pubDate>Wed, 20 Aug 2025 19:55:14 +0900</pubDate>
    </item>
    <item>
      <title>Maximum Likelihood Estimation방법으로 혼합 모형의 분산 성분 구하기</title>
      <link>https://bhpark.tistory.com/282</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;자료로부터 Maximum likelihood(ML) 방법으로 평균과 분산을 구해본 적이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://bhpark.tistory.com/212&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2020.04.24 - [Animal Breeding/Animal Breeding Etc] - Maximum Likelihood Estimation(MLE)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1755156346685&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Maximum Likelihood Estimation(MLE)&quot; data-og-description=&quot;Likelihood는 각 사건이 일어날 확률을 모두 곱한 것이다. 예를 들어 사람의 체중을 측정하였을 때 사람의 체중은 정규분포를 따르므로 평균과 분산이 알려져 있는 집단에서 60kg이 나올 확률은 정&quot; data-og-host=&quot;bhpark.tistory.com&quot; data-og-source-url=&quot;https://bhpark.tistory.com/212&quot; data-og-url=&quot;https://bhpark.tistory.com/212&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jknEf/hyZvvUkHhL/VFUZSoXiH1E4FYjoKpnZ40/img.jpg?width=800&amp;amp;height=1131&amp;amp;face=0_0_800_1131,https://scrap.kakaocdn.net/dn/bH3hrW/hyZvrLblNO/vVxjlv8kN6nFSZYQbZLjCk/img.jpg?width=800&amp;amp;height=1131&amp;amp;face=0_0_800_1131,https://scrap.kakaocdn.net/dn/bfu5d0/hyZyjdVsww/0XFkH3x0qOsJJBkKb4Bbk0/img.jpg?width=1654&amp;amp;height=2340&amp;amp;face=0_0_1654_2340&quot;&gt;&lt;a href=&quot;https://bhpark.tistory.com/212&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bhpark.tistory.com/212&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jknEf/hyZvvUkHhL/VFUZSoXiH1E4FYjoKpnZ40/img.jpg?width=800&amp;amp;height=1131&amp;amp;face=0_0_800_1131,https://scrap.kakaocdn.net/dn/bH3hrW/hyZvrLblNO/vVxjlv8kN6nFSZYQbZLjCk/img.jpg?width=800&amp;amp;height=1131&amp;amp;face=0_0_800_1131,https://scrap.kakaocdn.net/dn/bfu5d0/hyZyjdVsww/0XFkH3x0qOsJJBkKb4Bbk0/img.jpg?width=1654&amp;amp;height=2340&amp;amp;face=0_0_1654_2340');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Maximum Likelihood Estimation(MLE)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Likelihood는 각 사건이 일어날 확률을 모두 곱한 것이다. 예를 들어 사람의 체중을 측정하였을 때 사람의 체중은 정규분포를 따르므로 평균과 분산이 알려져 있는 집단에서 60kg이 나올 확률은 정&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bhpark.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 혼합 모형에서 임의 효과의 분산 성분을 구하는 것을 해 보자. 그런데 이전보다 먼저 이해해야 할 것이 참 많다. 다변량 정규 분포 함수나 다변량 우도 함수(likelihood function), 혼합 모형 관측치의 분산-공분산 행렬과 그 역행렬, 공분산 행렬과 MME의 계수 행렬의 행렬식, 투영 행렬(Projection matrix), 그리고 우도 함수의 로그를 취하여 미분하기, 그에 따른 V와 V의 역행렬의 미분, 행렬식의 로그값의 미분, P의 미분, Z'ZTZ'Z의 trace의 변형 등을 먼저 이해하여야 한다. 각각을 간단히 다룬 포스트가 있으므로 미리 공부하면 좋을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 혼합 모형에 대한 간단한 설명으로 시작해 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다변량 정규 분포의 likelihood function을 구해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 함수를 최대화하는 평균과 분산을 구하기 위하여 평균과 분산에 대하여 미분을 하는데 좀 복잡하여 로그를 취한후 미분을 하고 0과 같다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;등식을 만들고 등식의 좌변과 우변을 간단히 하여 최종적으로 분산 성분을 구할 수 있는 식을 유도한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;variance_component_estimation_maximum_likelihood_01_.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I5Qst/btsPSTqrnUo/5T3jN9MwN6cCP6u0TOOL40/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I5Qst/btsPSTqrnUo/5T3jN9MwN6cCP6u0TOOL40/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I5Qst/btsPSTqrnUo/5T3jN9MwN6cCP6u0TOOL40/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI5Qst%2FbtsPSTqrnUo%2F5T3jN9MwN6cCP6u0TOOL40%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4962&quot; height=&quot;7014&quot; data-filename=&quot;variance_component_estimation_maximum_likelihood_01_.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;variance_component_estimation_maximum_likelihood_02.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p79re/btsPTxULo1A/tw3D5gKYFJrJVW3Ksoy0Yk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p79re/btsPTxULo1A/tw3D5gKYFJrJVW3Ksoy0Yk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p79re/btsPTxULo1A/tw3D5gKYFJrJVW3Ksoy0Yk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp79re%2FbtsPTxULo1A%2Ftw3D5gKYFJrJVW3Ksoy0Yk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4962&quot; height=&quot;7014&quot; data-filename=&quot;variance_component_estimation_maximum_likelihood_02.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;variance_component_estimation_maximum_likelihood_03.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9bLwM/btsPUBvmetY/ruV6VT5jlJNqVWZqMqk3R1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9bLwM/btsPUBvmetY/ruV6VT5jlJNqVWZqMqk3R1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9bLwM/btsPUBvmetY/ruV6VT5jlJNqVWZqMqk3R1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9bLwM%2FbtsPUBvmetY%2FruV6VT5jlJNqVWZqMqk3R1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4962&quot; height=&quot;7014&quot; data-filename=&quot;variance_component_estimation_maximum_likelihood_03.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;variance_component_estimation_maximum_likelihood_04.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTxd6H/btsPUZbGLFJ/qkJ1Ze8fcKkKUjo349DJ01/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTxd6H/btsPUZbGLFJ/qkJ1Ze8fcKkKUjo349DJ01/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTxd6H/btsPUZbGLFJ/qkJ1Ze8fcKkKUjo349DJ01/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTxd6H%2FbtsPUZbGLFJ%2FqkJ1Ze8fcKkKUjo349DJ01%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4962&quot; height=&quot;7014&quot; data-filename=&quot;variance_component_estimation_maximum_likelihood_04.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;variance_component_estimation_maximum_likelihood_05.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1ZMku/btsPSZ5kLx3/kYZcOsFu17UzmJxek38LkK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1ZMku/btsPSZ5kLx3/kYZcOsFu17UzmJxek38LkK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1ZMku/btsPSZ5kLx3/kYZcOsFu17UzmJxek38LkK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1ZMku%2FbtsPSZ5kLx3%2FkYZcOsFu17UzmJxek38LkK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4962&quot; height=&quot;7014&quot; data-filename=&quot;variance_component_estimation_maximum_likelihood_05.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;variance_component_estimation_maximum_likelihood_06.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcxzR5/btsPVgqQpIX/V6AHtc9fgAbth7ttEUTtk0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcxzR5/btsPVgqQpIX/V6AHtc9fgAbth7ttEUTtk0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcxzR5/btsPVgqQpIX/V6AHtc9fgAbth7ttEUTtk0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcxzR5%2FbtsPVgqQpIX%2FV6AHtc9fgAbth7ttEUTtk0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4962&quot; height=&quot;7014&quot; data-filename=&quot;variance_component_estimation_maximum_likelihood_06.jpg&quot; data-origin-width=&quot;4962&quot; data-origin-height=&quot;7014&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;EM(expectation - maximization) Algorithm&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;육종가(u)와 분산 성분(sigma)은 서로 영향을 미친다. 분산 성분을 알아야 육종가를 구할 수 있고, 육종가를 알아야 분산 성분을 구할 수 있다. 그래서 실제 계산에서는 분산 성분을 모르므로 대충 초기치를 주고, 그 초기치를 기초로 육종가를 구한다(expectation). 그 육종가를 기초로 위 공식에 따라 분산 성분을 구한다(maximization). 이걸 계속 반복해서 안정화 될 때까지 한다. 안정의 기준은 육종가의 변화의 제곱의 합이 얼마 이하(보통 10-12승 에서 10-14승 이하)로 기준을 정하고 계속 반복한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 육종가를 (몇 개월 마다 자료가 추가되면) 계속적으로 구해야 하는 경우 분산 성분을 매번 구하면 안 된다. 분산 성분은 고정해 놓고, 자료가 추가된 것에 따라 육종가를 구해야 한다. 그런데 시간이 지나면 육종가도 변하므로 몇 년에 한 번 분산 성분을 재추정하고 다시 몇 년 동안 사용해야 한다. 자료가 많아지고, 개체 수가 많아지고, 동시에 구하는 형질의 수가 증가할 경우(다형질 모형, multiple traits model), 분산 성분 추정을 위하여 컴퓨터가 몇 개월씩 계산할 수도 있음을 알아야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;간단한 예제를 통하여 수식을 더 이해해 보자. 아래는 ML 방법으로 임의 효과가 1개인 모형의 분산 성분을 구하는 과정이다. 우선 문제는 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;example_with_one_random_factor.jpg&quot; data-origin-width=&quot;4097&quot; data-origin-height=&quot;2037&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfUDVZ/btsPZgS2NaR/kqFfo7PzX0QV7zKkaFzkS0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfUDVZ/btsPZgS2NaR/kqFfo7PzX0QV7zKkaFzkS0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfUDVZ/btsPZgS2NaR/kqFfo7PzX0QV7zKkaFzkS0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfUDVZ%2FbtsPZgS2NaR%2FkqFfo7PzX0QV7zKkaFzkS0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4097&quot; height=&quot;2037&quot; data-filename=&quot;example_with_one_random_factor.jpg&quot; data-origin-width=&quot;4097&quot; data-origin-height=&quot;2037&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위 least squares equation을 입력하고, 해를 풀고(expectation), 분산 성분을 구해 보자(maximization)&lt;/p&gt;
&lt;pre id=&quot;code_1755673580100&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;lhs = matrix(c(8, 0, 2, 3, 1, 2, 0,
               0, 14, 3, 3, 2, 4, 2,
               2, 3, 5, 0, 0, 0, 0,
               3, 3, 0, 6, 0, 0, 0,
               1, 2, 0, 0, 3, 0, 0,
               2, 4, 0, 0, 0, 6, 0,
               0, 2, 0, 0, 0, 0, 2
), nrow =7)
lhs

N = sum(diag(lhs)[1:2])
N

rhs = matrix(c(36.3, 67.2, 26.5, 30, 14.1, 26.2, 6.8), nrow = 7)
rhs

Xty = matrix(rhs[1:2], nrow = 2)
Xty

Zty = matrix(rhs[3:7], nrow = 5)
Zty

yty = 500

alpha = 6

lhs2 = lhs
diag(lhs2)[3:7] = diag(lhs2)[3:7] + alpha
lhs2

sol = solve(lhs2, rhs)
sol

b = matrix(sol[1:2], nrow = 2)
b

u = matrix(sol[3:7], nrow = 5)
u

ete = yty - t(b) %*% Xty - t(u) %*% Zty
ete

utu = t(u) %*% u
utu

sigma_e2 = ete / N
sigma_e2

sigma_s2 = (utu + sum(1/diag(lhs2)[3:7]) * sigma_e2 ) / nrow(u)
sigma_s2

alpha2 = sigma_e2 / sigma_s2
alpha2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위 R script를 실행한 결과이다.&lt;/p&gt;
&lt;pre id=&quot;code_1755673657680&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; lhs = matrix(c(8, 0, 2, 3, 1, 2, 0,
+                0, 14, 3, 3, 2, 4, 2,
+                2, 3, 5, 0, 0, 0, 0,
+                3, 3, 0, 6, 0, 0, 0,
+                1, 2, 0, 0, 3, 0, 0,
+                2, 4, 0, 0, 0, 6, 0,
+                0, 2, 0, 0, 0, 0, 2
+ ), nrow =7)
&amp;gt; lhs
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    8    0    2    3    1    2    0
[2,]    0   14    3    3    2    4    2
[3,]    2    3    5    0    0    0    0
[4,]    3    3    0    6    0    0    0
[5,]    1    2    0    0    3    0    0
[6,]    2    4    0    0    0    6    0
[7,]    0    2    0    0    0    0    2
&amp;gt; 
&amp;gt; N = sum(diag(lhs)[1:2])
&amp;gt; N
[1] 22
&amp;gt; 
&amp;gt; rhs = matrix(c(36.3, 67.2, 26.5, 30, 14.1, 26.2, 6.8), nrow = 7)
&amp;gt; rhs
     [,1]
[1,] 36.3
[2,] 67.2
[3,] 26.5
[4,] 30.0
[5,] 14.1
[6,] 26.2
[7,]  6.8
&amp;gt; 
&amp;gt; Xty = matrix(rhs[1:2], nrow = 2)
&amp;gt; Xty
     [,1]
[1,] 36.3
[2,] 67.2
&amp;gt; 
&amp;gt; Zty = matrix(rhs[3:7], nrow = 5)
&amp;gt; Zty
     [,1]
[1,] 26.5
[2,] 30.0
[3,] 14.1
[4,] 26.2
[5,]  6.8
&amp;gt; 
&amp;gt; yty = 500
&amp;gt; 
&amp;gt; alpha = 6
&amp;gt; 
&amp;gt; lhs2 = lhs
&amp;gt; diag(lhs2)[3:7] = diag(lhs2)[3:7] + alpha
&amp;gt; lhs2
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    8    0    2    3    1    2    0
[2,]    0   14    3    3    2    4    2
[3,]    2    3   11    0    0    0    0
[4,]    3    3    0   12    0    0    0
[5,]    1    2    0    0    9    0    0
[6,]    2    4    0    0    0   12    0
[7,]    0    2    0    0    0    0    8
&amp;gt; 
&amp;gt; sol = solve(lhs2, rhs)
&amp;gt; sol
            [,1]
[1,]  4.42362421
[2,]  4.78319695
[3,]  0.30028734
[4,]  0.19829471
[5,]  0.01222021
[6,] -0.14833635
[7,] -0.34579924
&amp;gt; 
&amp;gt; b = matrix(sol[1:2], nrow = 2)
&amp;gt; b
         [,1]
[1,] 4.423624
[2,] 4.783197
&amp;gt; 
&amp;gt; u = matrix(sol[3:7], nrow = 5)
&amp;gt; u
            [,1]
[1,]  0.30028734
[2,]  0.19829471
[3,]  0.01222021
[4,] -0.14833635
[5,] -0.34579924
&amp;gt; 
&amp;gt; ete = yty - t(b) %*% Xty - t(u) %*% Zty
&amp;gt; ete
         [,1]
[1,] 10.15069
&amp;gt; 
&amp;gt; utu = t(u) %*% u
&amp;gt; utu
          [,1]
[1,] 0.2712234
&amp;gt; 
&amp;gt; sigma_e2 = ete / N
&amp;gt; sigma_e2
          [,1]
[1,] 0.4613951
&amp;gt; 
&amp;gt; sigma_s2 = (utu + sum(1/diag(lhs2)[3:7]) * sigma_e2 ) / nrow(u)
&amp;gt; sigma_s2
           [,1]
[1,] 0.09980162
&amp;gt; 
&amp;gt; alpha2 = sigma_e2 / sigma_s2
&amp;gt; alpha2
         [,1]
[1,] 4.623122
&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이건 1 round만 한 것이고, 육종가 또는 분산 성분이 어느 정도 변하지 않을 때까지 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;계속 반복적으로 실행한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Animal Breeding/REML Variance Component Estimation</category>
      <category>EM algorithm</category>
      <category>Expectation Maximization</category>
      <category>maximum likelihood</category>
      <category>mixed model</category>
      <category>random effect</category>
      <category>variance component estimation</category>
      <category>분산 성분 추정</category>
      <author>투정이</author>
      <guid isPermaLink="true">https://bhpark.tistory.com/282</guid>
      <comments>https://bhpark.tistory.com/282#entry282comment</comments>
      <pubDate>Thu, 14 Aug 2025 16:47:59 +0900</pubDate>
    </item>
  </channel>
</rss>