有没有办法使用 postgresql 执行学生 t 检验

Posted

技术标签:

【中文标题】有没有办法使用 postgresql 执行学生 t 检验【英文标题】:Is there a way to perform a student t-test using postgresql 【发布时间】:2014-06-04 22:40:57 【问题描述】:

我在数据库中有一堆数据。

'Year', 'Disabled', 'non-disabled'
 1990,     5,             3
 1991,     2,             1

我希望能够找到每一列的所有年份的平均值。所以我想要残疾人的平均数字,然后我想要非残疾人的平均年数。然后我想使用 t 检验比较这两个值,看看两者之间是否存在显着差异。

我可以这样做吗? postgresql 是否有办法让我输入两个值并使用 t 检验获得 p 值?

【问题讨论】:

你有没有试过使用像avg(some_value)这样的sql聚合? PostgreSQL 本身只内置了有限的统计功能,但 PL/R 扩展支持比您想要的更多的统计测试和其他功能。也就是说,我可能会得到 avg 的平均值和 stddev 的标准差,然后将这些值插入到 Java 端的 t 检验中。 【参考方案1】:

虽然是一个老问题,但我不得不做同样的事情并且找不到直接的答案,所以我创建了自己的查询来做这件事。如果有任何统计解释错误,请帮助我改进。

WITH table_column1_stats_CTE AS (
    SELECT avg(column1) AS _mean, 
           stddev(column1) AS _stddev, 
           stddev(column1)/sqrt(count(*)) AS _se, 
           count(*) - 1 AS _df 
    FROM table
), table_column2_stats_CTE AS (
    SELECT avg(column2) AS _mean 
    FROM table
), t_value_CTE AS (
    SELECT _df, 
           abs(a._mean - b._mean) / (_stddev/sqrt(_df+1)) AS t_value 
    FROM table_column1_stats_CTE a, table_column2_stats_CTE b
), all_results_CTE AS (
    SELECT *, 
           row_number() OVER (ORDER BY abs(a.df - _df) ASC) AS rank 
    FROM t_test_table a, t_value_CTE b
)
SELECT 
        CASE WHEN t_value <= p01 THEN 0.99 
             WHEN t_value <= p05 THEN 0.95 
             WHEN t_value <= p1 THEN 0.9 
             WHEN t_value <= p2 THEN 0.8 ELSE 0.0 
        END AS significance
FROM all_results_CTE 
WHERE rank = 1

如果我可以附上 t_test_table 我会的,但你可以通过复制来创建它: https://jimgrange.wordpress.com/2015/12/05/statistics-tables-where-do-the-numbers-come-from/

【讨论】:

以上是关于有没有办法使用 postgresql 执行学生 t 检验的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSql那点事(文件读取写入命令执行的办法)

PostgreSQL:无法理解存在条件

PostgreSQL:块中的无效页眉

跟我一起读postgresql源码——Executor(查询执行模块之——Scan节点(下))

有没有办法设置一个选项,即使有错误也会导致 PostgreSQL 脚本继续?

有没有办法在聚合调用中不使用 ORDER BY 对 postgresql 自定义聚合中的行进行预排序?