Python 中每一行的两个样本 t 检验
Two sample t-test for every individual row in Python
我正在尝试进行双样本 t 检验,以检查两个数据集之间的均值是否存在显着差异。
我有两个数据集,每个数据集有 5 个试验,每个试验有 3 个特征。每个 Trial 都有不同的唯一标签,但 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
这就是我希望输出的样子,我希望将 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 returns 整列的值所以我会把我的两个值列放在一个地方,然后将我的数据拆分成临时数据集并获得 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')]
这样您就可以像以前一样执行相同的功能并获得所有值,
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
因此,您的数据子集的示例输出如下:
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
这不是最优雅的答案,但目前应该没问题,因为您只有小数据集!
我将上面的输出写入了两个制表符分隔的文件,我在下面阅读了它,并添加了一列来指示数据框或 table 它来自:
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()
以获得 table..
我正在尝试进行双样本 t 检验,以检查两个数据集之间的均值是否存在显着差异。
我有两个数据集,每个数据集有 5 个试验,每个试验有 3 个特征。每个 Trial 都有不同的唯一标签,但 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
这就是我希望输出的样子,我希望将 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 returns 整列的值所以我会把我的两个值列放在一个地方,然后将我的数据拆分成临时数据集并获得 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')]
这样您就可以像以前一样执行相同的功能并获得所有值,
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
因此,您的数据子集的示例输出如下:
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
这不是最优雅的答案,但目前应该没问题,因为您只有小数据集!
我将上面的输出写入了两个制表符分隔的文件,我在下面阅读了它,并添加了一列来指示数据框或 table 它来自:
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()
以获得 table..