将比例 z 检验应用于数据框中的每条记录

Posted

技术标签:

【中文标题】将比例 z 检验应用于数据框中的每条记录【英文标题】:apply proportion z-test to each record in dataframe 【发布时间】:2020-01-28 05:40:36 【问题描述】:

我有下面的代码,我试图将一个样本比例 ztest 应用于我数据中每一行的值。我有以下来自我的数据框 df 的示例数据。我正在尝试将每个价值比例与从计数值中获得的比例和从 obs 中的值获得的试验次数进行比较。我想要每条记录的 p 值。相反,我似乎为所有记录获得了一个 p 值。我在下面有几行所需的输出来说明我的意思。有人可以指出我做错了什么,以及如何解决它?或者建议一种更巧妙的方式来做到这一点?似乎真的应该有一种方法可以用熊猫来做到这一点。

# code:

def pvl(x):
    return sm.stats.proportions_ztest(x['count'], 
                              x['value'],
                              x['obs'], 
                              alternative='larger')[1]



df['pval']=df.apply(pvl,
                    axis=1
      )



# sample data:

print(df)

count   value     obs                         
211.0  0.013354  15800.0
18.0   0.001139  15800.0
310.0  0.019620  15800.0
114.0  0.007215  15800.0
 85.0  0.005380  15800.0


# sample output:

count   value     obs     pval                      
211.0  0.013354  15800.0  0.5
18.0   0.001139  15800.0  0.5
310.0  0.019620  15800.0  0.5
114.0  0.007215  15800.0  0.5
 85.0  0.005380  15800.0  0.5


# desired output:

count   value     obs     pval                      
211.0  0.013354  15800.0  0.49
18.0   0.001139  15800.0  4.1454796845134295e-41
310.0  0.019620  15800.0  0.9999999999965842

【问题讨论】:

【参考方案1】:

你的 pvl 函数有错误。 stats 模型中的proportion_ztest() 函数按以下顺序接受输入:count、nobs、value。因此,您应该将函数定义为:

def pvl(x):
    return sm.stats.proportions_ztest(x['count'], x['obs'], 
                          x['value'], alternative='larger')[1]

但是,根据您的数据,我得到的结果非常接近 0.5,而不是您列为所需输出的结果。我想知道您是如何获得第二个和第三个结果的,因为它们对我来说似乎是错误的(除非我误解了您的问题)。

【讨论】:

谢谢,是的,我注意到我在示例中运行了错误的数字。实际上,p 值​​都接近 0.5。它是四舍五入的。此外,我使用了错误的字段来比较值。所以代码是正确的,我输入错误的数字,谢谢。

以上是关于将比例 z 检验应用于数据框中的每条记录的主要内容,如果未能解决你的问题,请参考以下文章

将邮政编码 API 调用应用于数据框中的每一行

如何为数据库表中的每条记录生成一个id?

为嵌套列表中的每条记录绘制回归线

根据查询中的每条记录将报告打印为 PDF

为数据框中的每一行应用一个函数,用于另一个数据框中的每一行

将列表与 DataFrame 中的每条记录进行比较