2017-09-06 6 views
0

생물체의 동시 발현에 대한 PMI 점수를 계산해야합니다. Gene A - Gene B 또는 Gene C - Disease A 동시 발생은 Pubtator에서 추출되었습니다. 파이썬 3을 사용합니다.카운트에서 PMI를 계산하기위한 전략 : 데이터 프레임 또는 행렬

문서 세트의 경우, 모든 출처의 개별 수 freq(x)freq(y)을 공존 범주별로 추출했습니다. Gene-Gene 또는 Gene-Disease이고 엔티티 쌍의 공동 발생 카운트는 freq(x,y)입니다. 모든 카운트는 Dict에 저장됩니다.

원시 카운트에서 점별 상호 정보 (PMI) 점수를 계산하는 가장 좋은 방법이 될 것입니다 무엇 :

  • 두 개의 데이터 프레임 (동시 발생 횟수에 대한 개별 카운트 하나 하나)
  • 만들기를 두 개의 행렬을 만드시겠습니까? (위와 동일)
  • 또 다른 접근? entity, category, count 다른 세트는 4 열을 갖는다 :

하나 개의 데이터 세트가 3 열이 있는지 고려 카테고리가 동시 발생의 종류를 나타내는 entity_a, category, entity_b, count. 개별 엔티티 수에 대한 카테고리가 필요합니다. 왜냐하면 전체 총 카운트를 사용하면 특정 공존 유형에 대한 결과가 왜곡 될 수 있기 때문입니다.

데이터 프레임 접근 방식을 시도했지만 두 개의 다른 데이터 프레임 (DF)을 사용하여 결과를 계산하는 새로운 PMI 열을 만드는 방법을 이해할 수 없으므로 매트릭스 접근 방식이 더 잘 작동 할 수 있다고 생각하십니까? 그렇다면 왜? 데이터

예 DFS로 변환했을 때

df1.head()

ent rel count 177 5197 Gene_Gene 2 176 56744 Gene_Gene 2 175 12766 Gene_Gene 2 174 3091 Gene_Gene 2 173 3162 Gene_Gene 2

df2.head()

ent_a rel ent_b count 247 5197 Gene_Gene 56744 1 246 12766 Gene_Gene 5197 1 245 12766 Gene_Gene 56744 1 244 3091 Gene_Gene 3162 1 243 3091 Gene_Gene 54583 1

PMI를 수식 :

enter image description here

답변

0

나를 위해 작동하는 전략은 DataFrames (DFs)와 numpy 배열을 모두 사용하는 것으로 구성됩니다.

첫 번째 단계에서 DF는 동시 발생 개체의 개별 개수로 df2을 찾고 채우는 데 유용했습니다. 그런 다음 두 번째 단계에서 numpy 배열을 사용하여 각 동시 발생에 대한 (근사 된) PMI 점수를 효율적으로 계산합니다.

1 단계 : 조회 개별 공동 발생 엔티티

  • 첫번째 분할 수를 계산하고, 새로운 열 등을 각각 추가

    df_ab['ent_a'] = df_ab.ent_ab.apply(lambda x: x.split('-')[0])

  • 다음 룩업 함수를 호출 예를 들어 개인 수를 얻으려면:

    df_ab['ent_a_count'] = df_ab.ent_a.apply(get_ent, args=(df_a, 'ent_a',))

    조회 기능은 다음과 같다 : 벡터화 PMI Calcul :

    def get_ent(ent_df_ab, df_a, colname_df_ab): row_df_a = df_a[df_a[colname_df_ab] == ent_df_ab] i = row_df_a.iloc[0]['count'] return i

df2 이제이

``` 
     ent_ab count_ab  type ent_a ent_b ent_a_count ent_b_count 
0 5197-56744   2 Gene_Gene 5197 56744   2   2 
1 12766-5197   1 Gene_Gene 12766 5197   2   1 
2 12766-56744   1 Gene_Gene 12766 56744   2   2 
3 3091-3162   4 Gene_Gene 3091 3162   6   1 
4 3091-54583   2 Gene_Gene 3091 54583   6   1 
``` 

2 단계 같다 점수 계산

def compute_pmi(df): count_ab = np.array(df[['count_ab']]) ent_a_count = np.array(df[['ent_a_count']]) ent_b_count = np.array(df[['ent_b_count']]) pmi = np.round(count_ab/(ent_a_count * ent_b_count), 3) df['pmi'] = pmi return df

위한 ATION

  • NumPy와 스토리지 기반 함수