在Oracle 11g中复制Excel的CHIDIST函数

时间:2013-06-11 15:35:19

标签: oracle excel oracle11g statistics

我正在尝试在Oracle中复制Excel工作簿的功能。工作表上的公式之一使用CHIDIST,“返回卡方分布的单尾概率”。我无法在任何地方看到类似的功能!我是否必须编写自己的CHIDIST函数?

以下是有关CHIDIST的Excel文档的链接:http://office.microsoft.com/en-gb/excel-help/chidist-HP005209010.aspx

我已经研究过Chi Square和自由度。

由于

2 个答案:

答案 0 :(得分:0)

右尾概率......很好......

在oracle中,您可以将java代码嵌入到存储过程和函数中。最好的方法是 使用适当的java类并从oracle的函数中调用它。这并不难:

http://docs.oracle.com/cd/B19306_01/java.102/b14187/chfive.htm http://jwork.org/scavis/api/doc.php/umontreal/iro/lecuyer/probdist/ChiDist.html

这就是我能为你做的一切:

DECLARE
    l_value_to_evaluate NUMBER (10, 3) := 18.307;  /* X; Value at which you want to evaluate the distribution */
    l_degrees_freedom   NUMBER := 10;              /* Degrees of freedom */
    l_number NUMBER;

    FUNCTION is_number(str_in IN VARCHAR2) RETURN NUMBER
    IS
        n NUMBER;
    BEGIN
        n := TO_NUMBER(str_in);

        RETURN 1;
    EXCEPTION
        WHEN VALUE_ERROR THEN
            RETURN 0;
    END;
BEGIN
    -- If either argument is nonnumeric, CHIDIST returns the #VALUE! error value.
    l_number := is_number(l_value_to_evaluate);
    l_number := is_number(l_degrees_freedom);

    -- If x is negative, CHIDIST returns the #NUM! error value.
    IF SIGN(l_value_to_evaluate) = -1 THEN
        RAISE_APPLICATION_ERROR(-20998, '#NUM!');
    END IF;

    -- If degrees_freedom is not an integer, it is truncated.
    l_degrees_freedom := TRUNC(l_degrees_freedom);

    -- If degrees_freedom < 1 or degrees_freedom > 10^10, CHIDIST returns the #NUM! error value.
    IF l_degrees_freedom < 1
    OR l_degrees_freedom > POWER(10, 10) THEN
        RAISE_APPLICATION_ERROR(-20997, '#NUM!');
    END IF;

    -- CHIDIST is calculated as CHIDIST = P(X>x), where X is a χ2 random variable.
    /* Here the integral's implementation */
EXCEPTION
    WHEN VALUE_ERROR THEN
        RAISE_APPLICATION_ERROR(-20999, '#VALUE!');
END;

答案 1 :(得分:0)

如果您正在使用CHIDIST进行卡方检验,STATS_CROSSTAB函数可能是同一端的不同方法。它将计算两组配对观测值的卡方值,显着性或自由度。