簡體   English   中英

Python 中每一行的兩個樣本 t 檢驗

[英]Two sample t-test for every individual row in Python

我正在嘗試進行兩個樣本 t 檢驗,以檢查兩個數據集之間的均值是否存在顯着差異。

我有兩個數據集,每個數據集有 5 個試驗,每個試驗有 3 個特征。 每個試用版都有不同的獨特 label,但 3 個功能(X1、X2、X3 全部相同)。 在每個單獨的試驗中,我們都在測量 3 個特征,測量值如下所示。 我正在嘗試計算兩個數據集中每個特征的平均差。

這就是我從 SQL 獲取數據時的處理方式。

數據集 1:

T1  X1   0.93
T1  X2   0.3
T1  X3   -2.9
T2  X1   1.3
T2  X2   0.8
T2  X3   1.9
T3  X1   2.3
T3  X2   -1.8
T3  X3   0.9
T4  X1   0.3
T4  X2   0.8
T4  X3   0.9
T5  X1   0.3
T5  X2   0.8
T5  X3   0.9

數據集 2:

T10 X1  1.3
T10 X2  -2.8
T10 X3  0.09
T11 X1  3.3
T11 X2  0.8
T11 X3  1.9
T12 X1  0.3
T12 X2  -4.8
T12 X3  2.9
T13 X1  1.3
T13 X2  2.8
T13 X3  0.19
T14 X1  2.3
T14 X2  0.08
T14 X3  -0.9

這就是我希望我的 output 看起來的方式,我希望將 ttest 應用於每個功能,因此我可以獲得每個功能的 p 值

Feature  Mean-DataSET1  Mean-DataSET2  P-value 
X1
X2
X3  

當我執行 stats.ttest_ind(set1['value'], set2['value']).pvalue 時,我得到一個 pvalue

謝謝!

如果我正確理解您的問題,您可以使用 Groupby 獲得每個特征的平均值,然后在一個數據集中獲得每個特征的 p 值。 所以首先我會創建數據集,

a = {'Feature': ['X1','X2','X3','X4','X5']}
Results = pd.DataFrame(data = a)
Results.set_index('Feature')

然后為了得到你的特征的平均值,你可以使用 group by 並將結果發送到這個新的數據集,

Results['Mean-DataSET1'] = df1.groupby('feature')['value'].transform('mean')
Results['Mean-DataSET2'] = df2.groupby('feature')['value'].transform('mean')

現在據我所知,p-tests 返回整個列的值,所以我會將我的兩個值列放在一個地方,然后將我的數據拆分為臨時數據集並獲取這些的 p 值,

df['value2'] = df2['value']

xone = df[(df['col2'] == 'X1')]
xtwo = df[(df['col2'] == 'X2')] 
xthree = df[(df['col2'] == 'X3')] 
xfour = df[(df['col2'] == 'X4')] 
xfive = df[(df['col2'] == 'X5')] 

這樣,您可以像以前一樣執行相同的 function 並獲得所有值,

p_vals = ttest_ind(xone['value'], xone['value2']).pvalue, ttest_ind(xtwo['value'], xtwo['value2']).pvalue, ttest_ind(xthree['value'], xthree['value2']).pvalue, ttest_ind(xfour['value'], xfour['value2']).pvalue, ttest_ind(xfive['value'], xfive['value2']).pvalue

Results['P_value'] = p_vals

因此,您的數據子集上的示例 output 如下所示:

    Feature mean1   mean2   P_value
    X1  1.510000    1.633333    0.905175
    X2  -0.233333   -2.266667   0.326891
    X3  -0.033333   1.630000    0.377542

這不是最優雅的答案,但現在應該沒問題,因為您只有小數據集!

我將上面的 output 寫到兩個制表符分隔的文件中,然后在下面閱讀,並添加一列來指示 dataframe 或表來自:

import pandas as pd
from scipy.stats import ttest_ind
t1 = pd.read_csv("../t1.csv",names=['V1','V2','V3'],sep="\t")
t1['data'] = 'data1'
t2 = pd.read_csv("../t2.csv",names=['V1','V2','V3'],sep="\t")
t2['data'] = 'data2'

    V1  V2  V3  data
0   T1  X1  0.93    data1
1   T1  X2  0.30    data1
2   T1  X3  -2.90   data1
3   T2  X1  1.30    data1

然后我們將它們連接起來並直接計算平均值:

df = pd.concat([t1,t2])
res = df.groupby("V2").apply(lambda x:x['V3'].groupby(x['data']).mean())
data    data1   data2
V2      
X1  1.026   1.700
X2  0.180   -0.784
X3  0.340   0.836

p.value 需要在應用中進行更多編碼:

res['pvalue'] = df.groupby("V2").apply(lambda x:
                                       ttest_ind(x[x['data']=="data1"]["V3"],x[x['data']=="data2"]["V3"])[1])
data    data1   data2   pvalue
V2          
X1  1.026   1.700   0.316575
X2  0.180   -0.784  0.521615
X3  0.340   0.836   0.657752

您始終可以選擇執行res.reset_index()來獲取表格。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM