파이썬에서 DirectLiNGAM

파이썬에서 DirectLiNGAM(with bootstrapping)



메모 및 비망록

목차



◆ 소개
◆환경
◆ 절차
◆3 변수편
- 준비
- 데이터 생성
- 부트 스트랩
- 방향 확인
--DAG 확인
◆7 ​​변수편
- 준비
- 데이터 생성
- 부트 스트랩
- 방향 확인
--DAG 확인
◆참조

소개



마지막으로 구현 된 lingam 패키지를 사용하여 시뮬레이션 데이터를 추정했습니다.

파이썬에서 LiNGAM
h tps:// 퀵했다. 작은 m/곰 LP는/있어 MS/f05BD031cf9 다아 C464 아 0

환경



OS: Mojave (version; 10.14.6)
Python: 3.7.6
JupyterLab: 1.2.6

절차


  • 준비
  • 데이터 생성
  • 부트 스트랩
  • 방향 확인
  • DAG 확인

  • 3변수편



    준비


    # DirectLiNGAM
    # Import and sets
    import numpy as np
    import pandas as pd
    import graphviz
    import lingam
    from lingam.utils import make_dot
    
    print([np.__version__, pd.__version__, graphviz.__version__, lingam.__version__])
    
    np.set_printoptions(precision=3, suppress=True)
    np.random.seed(0)
    
    ['1.18.1', '1.0.1', '0.13.2', '1.2.1']
    

    데이터 생성


    # Create test data
    x0 = np.random.uniform(size=10000)
    x1 = 3.0*x0 + np.random.uniform(size=10000)
    x2 = 5.0*x0 + 0.5*x1 + np.random.uniform(size=10000)
    X = pd.DataFrame(np.array([x0, x1, x2]).T,columns=['x0', 'x1', 'x2'])
    X.head()
    
        x0  x1  x2
    0   0.758125    2.643633    5.420089
    1   0.503319    1.721282    3.439239
    2   0.177017    1.007955    2.377846
    3   0.832537    2.579844    6.171695
    4   0.516825    1.788134    4.235760
    
    # Visualize the test data
    m = np.array([[0.0, 0.0, 0.0],
                [3.0, 0.0, 0.0],
                [5.0, 0.5, 0.0]])
    make_dot(m)
    



    이 인과 관계는 부트 스트랩 방법을 사용하여 추정됩니다.

    부트 스트랩


    model = lingam.DirectLiNGAM()
    result = model.bootstrap(X, 3000) # Number of bootstrapping samples
    
    cdc = result.get_causal_direction_counts(n_directions=10, min_causal_effect=0.1)
    

    방향 확인


    from lingam.utils import print_causal_directions
    print_causal_directions(cdc, 3000)
    
    x1 <--- x0  (100.0%)
    x2 <--- x0  (100.0%)
    x2 <--- x1  (100.0%)
    

    이번은 간단한 데이터이므로 이 시점에서 인과관계가 분명했다.

    DAG 확인



    전단계에서는 어디까지나 변수간의 1 대 1 관계를 보고 있었다.
    이번에는 그들을 통합하여 DAG로 봅니다.
    dagc = result.get_directed_acyclic_graph_counts(n_dags=5, min_causal_effect=0.1)
    
    from lingam.utils import print_dagc
    print_dagc(dagc, 3000)
    
    DAG[0]: 100.0%
        x1 <--- x0 
        x2 <--- x0 
        x2 <--- x1 
    

    잘 방향을 추정할 수 있었다.
    DAG 후보를 5개까지 출력하도록 설정했지만 100.0%였기 때문인지 나머지는 출력되지 않았다.
    # Get the probability of bootstrapping.
    prob = result.get_probabilities(min_causal_effect=0.1)
    print(prob)
    
    [[0. 0. 0.]
     [1. 0. 0.]
     [1. 1. 0.]]
    

    확률도 1로 출력되었다.

    7변수편



    다소 복잡하게 하여 이 인과관계를 추정하였다.

    준비


    # DirectLiNGAM
    # Import and sets
    import numpy as np
    import pandas as pd
    import graphviz
    import lingam
    from lingam.utils import make_dot
    
    print([np.__version__, pd.__version__, graphviz.__version__, lingam.__version__])
    
    np.set_printoptions(precision=3, suppress=True)
    np.random.seed(0)
    
    ['1.18.1', '1.0.1', '0.13.2', '1.2.1']
    

    데이터 생성


    # Create test data
    x0 = np.random.uniform(size=10000)
    x6 = np.random.uniform(size=10000)
    x1 = -5.0*x0 + np.random.uniform(size=10000)
    x2 = -2.5*x0 + 3.0*x1 + np.random.uniform(size=10000)
    x5 = 6.0*x6 + np.random.uniform(size=10000)
    x3 = 4.0*x2 + 7.0*x5 + np.random.uniform(size=10000)
    x4 = 1.0*x1 + 2.0*x2 + 8.0*x6 +np.random.uniform(size=10000)
    
    X = pd.DataFrame(np.array([x0, x1, x2, x3, x4, x5, x6]).T,columns=['x0', 'x1', 'x2', 'x3', 'x4', 'x5', 'x6'])
    X.head()
    
        x0  x1  x2  x3  x4  x5  x6
    0   0.548814    -2.351895   -7.669592   3.641327    -10.776980  4.858864    0.748268
    1   0.715189    -3.534790   -11.889026  -38.446302  -24.968283  1.292542    0.180203
    2   0.602763    -2.090516   -7.601441   -9.739672   -13.753596  2.811044    0.389023
    3   0.544883    -2.318181   -7.484214   -27.062919  -16.475002  0.307835    0.037600
    4   0.423655    -1.173992   -4.064288   -13.340880  -8.625065   0.308386    0.011788
    
    # Visualize the test data
    m = np.array([[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
                [-5.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
                [-2.5, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0],
                [0.0, 0.0, 4.0, 0.0, 0.0, 7.0, 0.0],
                [0.0, 1.0, 2.0, 0.0, 0.0, 0.0, 8.0],
                 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.0],
                 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]])
    make_dot(m)
    



    이 인과 관계는 부트 스트랩 방법을 사용하여 추정됩니다.

    부트 스트랩


    model = lingam.DirectLiNGAM()
    result = model.bootstrap(X, 3000) # Number of bootstrapping samples
    
    cdc = result.get_causal_direction_counts(n_directions=10, min_causal_effect=0.1)
    

    방향 확인


    from lingam.utils import print_causal_directions
    print_causal_directions(cdc, 3000)
    
    x1 <--- x0  (100.0%)
    x2 <--- x0  (100.0%)
    x2 <--- x1  (100.0%)
    x3 <--- x5  (100.0%)
    x4 <--- x1  (100.0%)
    x4 <--- x2  (100.0%)
    x5 <--- x6  (100.0%)
    x4 <--- x6  (97.4%)
    x3 <--- x2  (96.1%)
    x3 <--- x4  (4.8%)
    

    DAG 확인


    dagc = result.get_directed_acyclic_graph_counts(n_dags=5, min_causal_effect=0.1)
    
    from lingam.utils import print_dagc
    print_dagc(dagc, 3000)
    
    DAG[0]: 88.5%
        x1 <--- x0 
        x2 <--- x0 
        x2 <--- x1 
        x3 <--- x2 
        x3 <--- x5 
        x4 <--- x1 
        x4 <--- x2 
        x4 <--- x6 
        x5 <--- x6 
    DAG[1]: 3.9%
        x1 <--- x0 
        x2 <--- x0 
        x2 <--- x1 
        x3 <--- x4 
        x3 <--- x5 
        x4 <--- x1 
        x4 <--- x2 
        x4 <--- x6 
        x5 <--- x6 
    DAG[2]: 2.7%
        x1 <--- x0 
        x2 <--- x0 
        x2 <--- x1 
        x3 <--- x2 
        x3 <--- x5 
        x4 <--- x0 
        x4 <--- x1 
        x4 <--- x2 
        x4 <--- x6 
        x5 <--- x6 
    DAG[3]: 2.6%
        x1 <--- x0 
        x2 <--- x0 
        x2 <--- x1 
        x3 <--- x2 
        x3 <--- x5 
        x4 <--- x1 
        x4 <--- x2 
        x4 <--- x3 
        x5 <--- x6 
    DAG[4]: 0.9%
        x1 <--- x0 
        x2 <--- x0 
        x2 <--- x1 
        x3 <--- x2 
        x3 <--- x4 
        x3 <--- x5 
        x4 <--- x1 
        x4 <--- x2 
        x4 <--- x6 
        x5 <--- x6 
    

    88.5%로 정확한 인과관계를 추정할 수 있었다.
    prob = result.get_probabilities(min_causal_effect=0.1)
    print(prob)
    
    [[0.    0.    0.    0.    0.    0.    0.   ]
     [1.    0.    0.    0.    0.    0.    0.   ]
     [1.    1.    0.    0.    0.    0.    0.   ]
     [0.006 0.    0.961 0.    0.048 1.    0.007]
     [0.027 1.    1.    0.026 0.    0.    0.974]
     [0.    0.    0.    0.    0.    0.    1.   ]
     [0.    0.    0.    0.    0.    0.    0.   ]]
    

    참조



    ・수식과 Python으로 이해하는 LiNGAM(ICA판)
    htps : // 코 m / k 코 테라 / ms / 6d7f5598464 18 아후 아 7c
    · 구조 방정식 모델에 의한 인과 추론 : 인과 구조 탐색에 관한 최근의 발전
    htps //w w. s에서 멋지다. 네 t/시시미즈 2006/bsj2012ー
    · 파이썬에서 LiNGAM
    h tps:// 퀵했다. 작은 m/곰 LP는/있어 MS/f05BD031cf9 다아 C464 아 0
    · LiNGAM docs
    h tps : // ㅃ가 m. Red d. cs. 이오 / 엔 / 아 st / 가서 x. HTML
    · lingam GitHub (examples)
    htps : // 기주 b. 이 m / cdt15 / ぃ가 m / t ree / 뭐 r / 에 mp ぇ s

    좋은 웹페이지 즐겨찾기