1

有谁知道 Excel FDIST 和 FINV 的 SQL 中是否有兼容的函数?如果没有,有人知道如何构建它吗?可能在 C# 中?

谢谢。非常感谢您的帮助。

4

4 回答 4

1

我已经设法通过使用 .Net Framework 4.0 及更高版本(System.Windows.Forms.DataVisualization.Charting.StatisticFormula)中的库来解决我的问题。

我可以使用上面的库在 C# 中开发一个函数用于我的计算过程。这是一个功能强大的库,您可以在其中找到最常用的统计公式(例如均值、中位数、t 分布、f 分布和它们的倒数。)

以下是我的代码片段:

using System.Windows.Forms.DataVisualization.Charting;

private Chart ch = new Chart(); // You will need to declare an object of Chart type, as Statistic Formula class does not have a public constructor
double fDist = ch.DataManipulator.Statistics.FDistribution(fRatioVariance, degreeFreedom1, degreeFreedom2);

希望这对其他人有帮助。谢谢。

于 2013-10-11T02:01:35.427 回答
1

虽然为时已晚,但下面是 SQL Server 本身的一些统计功能实现。

要获得 FDist 函数(相当于 Excel - FDist),我们将需要 Complete 和 Incomplete beta 函数以及 gamma 函数:

--GAMMA Function
CREATE FUNCTION [dbo].[udf_Gamma]
(
@x Float=NULL
)
RETURNS Float
AS
BEGIN

Declare @f Float = 10E99;
Declare @g Float = 1;
        if ( @x > 0 )
        Begin
            while (@x < 3)
            Begin
                SET @g = @g * @x;
                SET @x = @x + 1;
            End
            SET @f = (1 - (2/(7*power(@x,2))) * (1 - 2/(3*power(@x,2))))/(30*power(@x,2));
            SET @f = (1-@f)/(12*@x) + @x*(log(@x)-1);
            SET @f = (exp(@f)/@g)*power(2*PI()/@x,0.5);
        End
        else 
        Begin
            SET @f = 10E99
        End
return @f;

END

--BETA Complete Function
CREATE FUNCTION [dbo].[udf_BetaC]
(
@x Float=NULL
,@a Float=NULL
,@b Float=NULL
)
RETURNS Float
AS
BEGIN
--double betacf(double a,double b,double x){

Declare @maxIterations int = 50, @m int =1
Declare @eps Float = 3E-5
Declare @am Float = 1;
Declare @bm Float = 1;
Declare @az Float = 1;
Declare @qab Float = @a+@b;
Declare @qap Float = @a+1;
Declare @qam Float = @a-1;
Declare @bz Float = 1 - @qab*@x/@qap;
Declare @aold Float = 0;
Declare @em Float, @tem Float, @d Float, @ap Float, @bp Float, @app Float, @bpp Float;

while((@m<@maxIterations) AND (abs(@az-@aold)>=@eps*abs(@az)))
Begin
    SET @em = @m;
    SET @tem = @em+@em;
    SET @d = @em*(@b-@m)*@x/((@qam + @tem)*(@a+@tem));
    SET @ap = @az+@d*@am;
    SET @bp = @bz+@d*@bm;
    SET @d = -(@a+@em)*(@qab+@em)*@x/((@a+@tem)*(@qap+@tem));
    SET @app = @ap+@d*@az;
    SET @bpp = @bp+@d*@bz;
    SET @aold = @az;
    SET @am = @ap/@bpp;
    SET @bm = @bp/@bpp;
    SET @az = @app/@bpp;
    SET @bz = 1;
    SET @m = @m + 1;
End

return @az

END

--BETA INCOMPLETE Function
CREATE FUNCTION [dbo].[udf_BetaI]
(
@x Float=null
,@a Float=null
,@b Float=null
)
RETURNS Float
AS
BEGIN

Declare @bt Float=0.0
Declare @beta Float=0.0

        if( @x=0 OR @x=1 )
        Begin
            SET @bt = 0
        End
        else if((@x>0) AND (@x<1)) 
            Begin
                SET @bt = (Select dbo.UDF_Gamma(@a+@b)* power(@x,@a)* power(1-@x,@b)/(dbo.UDF_Gamma(@a)*dbo.UDF_Gamma(@b)) )
            End
        if(@x<(@a+1)/(@a+@b+2))
        Begin
            SET @beta = (Select @bt*dbo.udf_betaC(@x,@a,@b)/@a)
        End
        else 
        Begin
            SET @beta = (Select 1-@bt*dbo.udf_betaC(1-@x,@b,@a)/@b)
        End

Return @beta

END

--FDist Function
CREATE FUNCTION [dbo].[udf_FDist] 
(
@x Float=NULL
,@df1 Float=NULL
,@df2 Float=NULL
)
RETURNS Float
AS
BEGIN
    Declare @x1 Float=(@x*@df1)/((@x*@df1)+@df2)

    return (select 1 - dbo.udf_BetaI(@x1,(@df1/2),(@df2/2)))

END

检查 Excel =FDIST(0.5,1,1)=0.608173448 和 SQL 编辑器 = SELECT udf_FDIST(0.5,1,1)=0.608173457369209

问候, 阿维

于 2016-03-05T10:59:36.373 回答
0

FDIST 一个 FINV 在 Sql Server 中不存在。

您可以编写一个 SQL Sever 函数来实现两个 excel 功能。

在此处显示以创建函数

于 2013-10-08T07:27:47.113 回答
0

在 MS SQL Server 中有standard_deviation 和一些更多的统计函数,包括方差。

还有一百万种变通方法,例如:http: //oreilly.com/catalog/transqlcook/chapter/ch08.html

,不过,您需要深入研究这些数学。

于 2013-10-08T10:32:49.467 回答