2017-09-06 15 views
0

バイオエンティティの同時発生のためのPMIスコアを計算する必要があります。 Gene A - Gene B、またはGene C - Disease Aです。共起はPubtatorから抽出されました。私はPython 3を使用しています。カウントからPMIを計算するための戦略:データフレームまたは行列

文書のセットについては、共起カテゴリですべてのエンティティの個数freq(x)freq(y)を抽出しました。 Gene-GeneまたはGene-Diseaseであり、エンティティペアの同時出現回数はfreq(x,y)です。すべてのカウントはDictに格納されます。生のカウントから点単位相互情報量を計算するための最良の方法だろう何

(PMI)スコア:

    • は、2つのデータフレームを作成します(個別のカウントのための1つをと共起のための1がカウント) 2つの行列を作成しますか? (上記と同じ)
    • 別のアプローチ? entity, category, countおよび他のセットが4つの列を有している:

  • データの一組は、3つの列を有していることを検討カテゴリが共起カテゴリを表す entity_a, category, entity_b, count。個々のエンティティカウントのカテゴリが必要です。なぜなら、全体の合計カウントを使用すると、特定の共起タイプの結果が歪むためです。

    私はデータフレームアプローチを試みましたが、2つの異なるデータフレーム(DF)を使用して結果を計算する新しいPMIカラムを作成する方法を理解できませんでした。もしそうなら、なぜですか? DFに変換されたデータの

    例:

    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)。次に、第2のステップでは、それぞれの共起のスコアを(近似した)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

    スコアを計算するためのnumpyのアレイベースの機能
    関連する問題