sql - PIL 逊相关 SQL Server

标签 sql sql-server

我有两个表:

ID,YRMO,计数

1,2013,12,4

1,2014年1月,6

1,2014,2,7

2,2014,1,6

2,2,2014,8

ID,YRMO,计数

2013-12-10

1,2014年1月,8

1、2014、3、12

2,2014年1月,6

2,2014,2,10

我想找出每组 ID 的 PIL 逊相关系数。大约有 200 多种不同的 IDS。

PIL 逊相关性是衡量两个变量 X 和 Y 之间线性相关性(相关性)的量度,给出的值介于 +1 和 -1 之间

可以在这里找到更多信息:http://oreilly.com/catalog/transqlcook/chapter/ch08.html 在计算相关部分

最佳答案

计算 PIL 逊相关系数;您需要先计算Mean,然后是standard daviation,然后是correlation coefficient,如下所述

1。计算平均值

insert into tab2 (tab1_id, mean)
select ID, sum([counts]) / 
(select count(*) from tab1) as mean
from tab1
group by ID;

2。计算标准偏差

update tab2
set stddev = (
select sqrt(
sum([counts] * [counts]) / 
(select count(*) from tab1)
- mean * mean
) stddev
from tab1
where tab1.ID = tab2.tab1_id
group by tab1.ID);

3。最后 Pearson 相关系数

select ID,
((sf.sum1 / (select count(*) from tab1)
- stats1.mean * stats2.mean
)
/ (stats1.stddev * stats2.stddev)) as PCC
from (
select r1.ID,
 sum(r1.[counts] * r2.[counts]) as sum1
from tab1 r1
join tab1 r2
on r1.ID = r2.ID
group by r1.ID
) sf
join tab2 stats1
on stats1.tab1_id = sf.ID
join tab2 stats2
on stats2.tab1_id = sf.ID

根据您发布的数据得出的结果

enter image description here

在这里查看演示 fiddle http://sqlfiddle.com/#!3/0da20/5

编辑:

好精炼一点。您可以使用以下函数获取 PCC,但我没有得到与您完全相同的结果,而是得到 0.999996000000000 for ID = 1

这对您来说可能是一个很好的切入点。您可以从此处进一步优化计算。

create function calculate_PCC(@id int)
returns decimal(16,15)
as
begin
declare @mean numeric(16,5);
declare @stddev numeric(16,5);
declare @count numeric(16,5);
declare @pcc numeric(16,12);
declare @store numeric(16,7);
select @count = CONVERT(numeric(16,5), count(case when Id=@id then 1 end)) from tab1;
select @mean = convert(numeric(16,5),sum([Counts])) / @count
from tab1 WHERE ID = @id;
select @store = (sum(counts * counts) / @count) from tab1 WHERE ID = @id;
set @stddev = sqrt(@store - (@mean * @mean)); 
set @pcc = ((@store - (@mean * @mean)) / (@stddev * @stddev)); 

return @pcc;
end

像这样调用函数

select db_name.dbo.calculate_PCC(1)

关于sql - PIL 逊相关 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23415492/

相关文章:

sql - 有什么理由不加入 Foreign Key 到 Foreign Key 吗?

sql-server - SSRS 2014 数据库设置 - 不支持错误 "Using other editions of SQL Server for report data sources..."

sql - Postgres 上的 C 语言环境和 Posix 语言环境有什么区别?

SQL 子查询/连接

sql-server - 如果在存储过程运行时更改它会发生什么?

sql - 将 "nvarchar"列数据类型转换为 "DateTime'

c# - 基于服务的数据库和本地数据库之间的混淆

mysql - SQL:从最后 N(两个)条目中获取平均结果

mysql - 选择偏移量 > 0 的最大值返回 nil

java - 没有找到合适的驱动程序