【发布时间】: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