【问题标题】:Automate Regression Analysis in SQL Database在 SQL 数据库中自动进行回归分析
【发布时间】:2020-07-04 01:13:49
【问题描述】:

我有一个数据库,其中包含投票区级别的选举结果。我还有每个选区的年龄构成,特别是 65 岁以上选民的百分比。我想计算每次选举的线性回归,将每个候选人的支持率与 65 岁以上的选民百分比进行比较,看看是否两者之间有任何关系。例如,65 岁以上人口比例较高的选区是否以较高的比率支持候选人 X?

我可以为单次选举执行此操作,但我想知道是否有一种方法可以使我拥有的数千次选举的流程自动化。即使我必须将其分解为多个步骤。我完全不知道如何做到这一点,所以任何能推动我朝着正确方向前进的事情都会有所帮助。

我的桌子是:

results table:
id
contest_id
precinct_id
candidate_name
candidate_votes

precinct_table:
precinct_id
percent_over_65

选择比赛 = 1 的所有候选人,并在名称周围加上括号,以便我可以运行数据透视表

select distinct ',' + quotename(candidate_name) as column_name
from results
where contest = 1

然后我将候选人列表复制到数据透视表代码中

select * into temp_table1 from 
(select precinct_id, candidate_name, votes from results) as base_data
pivot (
    sum(votes)
    for candidate_name
    in (
    [Jane Doe] 
    ,[John Does])   
    ) as pivot_table
where [Jane Doe] is not null and [John Doe] > 0 and [Jane Doe] > 0 -- prevent divide by 0 errors

然后我运行代码将整数转换为小数并为候选人姓名创建别名

select precinct_id as p, cast([Jane Does] as decimal(15,10)) as a, cast([John Doe] as decimal(15,10)) as b into temp_table2
from temp_table

然后我创建另一个表以获得一个干净的表,为回归分析做好准备

select p, a/(a+b) as a_support, cast(over_65 as decimal(15,10))  / cast(total_people as decimal(15,10)) as percent_over_65 into temp_table3
from temp_table2
inner join precinct on precinct.id = temp_table2.p

至此,我终于有了一个长这样的表

p     a_support      percent_over_65
1        .55               .78   
2        .33               .45    
3        .34               .65

现在我终于清理了我的数据并准备好运行回归分析

declare @n as decimal(15,10)
select @n = count(*) from temp_table3
select (@n * sum(percent_over_65 * a_support) - sum(percent_over_65) * sum(a_support)) / (@n * sum(percent_over_65 * percent_over_65) - sum(percent_over_65)*sum(percent_over_65)) as m from temp_table3
select avg(a_support) - avg(percent_over_65) * (@n * sum(percent_over_65 * a_support) - sum(percent_over_65) * sum(a_support)) / (@n * sum(percent_over_65 * percent_over_65) - sum(percent_over_65)*sum(percent_over_65)) as intercept
from temp_table3

如果我只有一场比赛可以进行分析,那就太好了。但是,如果我有 100 个不同的比赛要进行分析,那该怎么办。我有什么可以加快这个过程的吗?我意识到这可能超出了 SQL 的范围,但我想在我放弃之前我会问。如果有人有任何建议,请告诉我,即使它是 SQL 之外的东西。这是 R 能做到的吗?

我可以很容易地得到一个如下所示的表格,但这是我能做到的。

Precinct_ID     Contest1_candidateA    Contest1_candidateB     Contest2_candidateA   Contest2_candidateB
1                     100                     200                     NULL                   NULL
2                     200                     200                     200                     150
3                     NULL                    NULL                    150                     250
4                     500                     100                     100                     300  

谢谢!

【问题讨论】:

    标签: sql r sql-server linear-regression


    【解决方案1】:

    只需了解您可以使用的工具。将 R 用于数据科学,将 SQL Server 用于数据存储或持久性。回想一下,SQL 是一种特殊用途的声明性语言(即,设计用于非常狭窄的特定、基于集合的操作),而 R 是一种通用的解释性语言,主要用作统计环境(即,设计用于完成大多数需要数学和统计的事情)计算)。

    所以,是的,使用 R 对来自 SQL Server 的数据自动进行回归分析。更好的是,对于适用于 Windows 的 SQL Server 2016、2017 和 2019,您可以使用 R Services! 直接在 SQL Server 中运行 R!

    因此,请考虑以下步骤:

    1. 连接 R 和 SQL Server(请参阅 odbc 包或运行特殊的 stored proc)。
    2. 查询所有选举数据并将数据导入数据框。
    3. 使用reshape 将数据重新格式化为宽结构(类似于PIVOT)。
    4. as.numeric 转换数值数据(类似于CAST)。
    5. 使用lmglm 运行所需的回归。

    除此之外,听起来像是一个有趣的数据和分析项目! OP 玩得很开心!

    【讨论】:

    • 这正是我所希望的。我对 R 还很陌生,不知道从哪里开始,所以现在我的工作已经完成了!感谢您的帮助!
    【解决方案2】:

    我完全同意 @Parafait 的 cmets,使用 R 将获得更丰富的功能和统计工具集。对于与统计计算相关的事情,它也是适合这项工作的工具。

    谈到这个问题,我相信您已经能够成功地获得单个比赛所需的计算,现在您希望包括计算比赛的完整列表。

    如果您能够创建一个存储过程以获得所需的输出,通过将竞赛 ID 作为输入传递给该过程,那么您可以通过任何 ETL 工具调用此存储过程,例如:SSIS 并使用 for-loop 容器. for-loop 将接收竞赛 ID 并一个接一个地计算结果。

    如果您想进一步优化,您可以使用 SSIS 在序列容器中运行并行工作流,该容器将以并行方式独立启动存储过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 2018-04-09
      • 2018-11-28
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      • 2017-03-08
      相关资源
      最近更新 更多