楼主: winddr
5780 9

计算分布集中度 [推广有奖]

  • 0关注
  • 9粉丝

已卖:288份资源

博士生

91%

还不是VIP/贵宾

-

威望
0
论坛币
59 个
通用积分
111.2336
学术水平
5 点
热心指数
7 点
信用等级
3 点
经验
4300 点
帖子
165
精华
0
在线时间
523 小时
注册时间
2006-3-4
最后登录
2025-11-20

楼主
winddr 发表于 2015-10-6 00:54:25 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
论坛各位高手,现有如下数据:

contest

t

solver

1

1

a

1

2

b

1

3

c

1

4

d

1

5

e

1

6

b

1

7

b

1

8

f

1

9

c

1

10

a

1

11

g

1

12

e

1

13

b

1

14

d

1

15

c

1

16

c

1

17

h

1

18

i

1

19

a

1

20

e

2

1

a

2

2

a

2

3

a

2

4

b

2

5

c

2

6

d

2

7

a

2

8

e

2

9

e

2

10

f

2

11

b

2

12

f

2

13

g

2

14

h

2

15

i

2

16

d

2

17

d

contest表示竞赛场数,solver表示竞赛参赛选手,t表示参赛选手方案提交时间。现欲计算方案提交集中度变量,此变量定义如下:
根据原始数据生成如下数据:
contesttsolverabcdefghin1n2average集中度1集中度2
11a11

1

1

00
12b112

2

1

00
13c1113

3

1

00
14d11114

4

1

00
15e111115

5

1

00
16b121115

6

1.2

0.40.365148
17b131115

7

1.4

0.80.676123
18f1311116

8

1.33333

0.7453560.645497
19c1321116

9

1.5

0.7637630.62361
110a2321116

10

1.66667

0.7453560.57735
111g23211117

11

1.57143

0.7284310.581087
112e23212117

12

1.71429

0.6998540.534522
113b24212117

13

1.85714

0.9897430.726273
114d24222117

14

2

0.925820.654654
115c24322117

15

2.14286

0.9897430.676123
116c24422117

16

2.28571

1.1605770.767649
117h244221118

17

2.125

1.1659220.799816
118i2442211119

18

2

1.1547010.816497
119a3442211119

19

2.11111

1.1967030.823628
120e3442311119

20

2.22222

1.2272620.823273
21a
22a
23a
24b
25c

n1表示参赛选手个数,n2表示方案个数。average表示人均方案数(=n2/n1),其中集中度1计算公式为:
集中度1(contest=1, t=1)=sqrt(((No.a-average)^2)/n1)
集中度1(contest=1, t=2)=sqrt(((No.a-average)^2+(No.b-average)^2)/n1)
集中度1(contest=1, t=3)=sqrt(((No.a-average)^2+(No.b-average)^2+(No.c-average)^2)/n1)
......
集中度2计算公式为:
集中度2(contest=1, t=1)=sqrt(((No.a-average)^2)/n2)
集中度2(contest=1, t=2)=sqrt(((No.a-average)^2+(No.b-average)^2)/n2)
集中度2(contest=1, t=3)=sqrt(((No.a-average)^2+(No.b-average)^2+(No.c-average)^2)/n2)
......

求论坛内各位高手如何计算集中度1和集中度2以便得到如下数据(见下表)。展示的数据中为了便于理解,我预先设置了a-i个solver。但是实际数据中solver的个数众多,事先并不知道solver的具体个数以及其提交方案的次数。
contesttsolver集中度1集中度1
11a00
12b00
13c00
14d00
15e00
16b0.40.36515
17b0.80.67612
18f0.745360.6455
19c0.763760.62361
110a0.745360.57735
111g0.728430.58109
112e0.699850.53452
113b0.989740.72627
114d0.925820.65465
115c0.989740.67612
116c1.160580.76765
117h1.165920.79982
118i1.15470.8165
119a1.19670.82363
120e1.227260.82327
21a
22a
23a
24b
25c

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:集中度 average Contest ABCDEFG Solver

沙发
teqel 发表于 2015-10-6 11:03:56
帮你做了一步
  1. data test;
  2. infile cards dlm='09'x;
  3. input contest t        solver $;
  4. cards;
  5. 1        1        a
  6. 1        2        b
  7. 1        3        c
  8. 1        4        d
  9. 1        5        e
  10. 1        6        b
  11. 1        7        b
  12. 1        8        f
  13. 1        9        c
  14. 1        10        a
  15. 1        11        g
  16. 1        12        e
  17. 1        13        b
  18. 1        14        d
  19. 1        15        c
  20. 1        16        c
  21. 1        17        h
  22. 1        18        i
  23. 1        19        a
  24. 1        20        e
  25. 2        1        a
  26. 2        2        a
  27. 2        3        a
  28. 2        4        b
  29. 2        5        c
  30. 2        6        d
  31. 2        7        a
  32. 2        8        e
  33. 2        9        e
  34. 2        10        f
  35. 2        11        b
  36. 2        12        f
  37. 2        13        g
  38. 2        14        h
  39. 2        15        i
  40. 2        16        d
  41. 2        17        d
  42. ;

  43. proc sql;
  44. create table test1 as
  45. select         a.contest,
  46.                 a.t,
  47.                 a.solver,
  48.                 sum(case when b.solver='a' then 1 else . end) as a,
  49.                 sum(case when b.solver='b' then 1 else . end) as b,
  50.                 sum(case when b.solver='c' then 1 else . end) as c,
  51.                 sum(case when b.solver='d' then 1 else . end) as d,
  52.                 sum(case when b.solver='e' then 1 else . end) as e,
  53.                 sum(case when b.solver='f' then 1 else . end) as f,
  54.                 sum(case when b.solver='g' then 1 else . end) as g,
  55.                 sum(case when b.solver='h' then 1 else . end) as h,
  56.                 sum(case when b.solver='i' then 1 else . end) as i
  57. from test as A left join test as B
  58. on B.t<=A.t and A.contest=B.contest
  59. group by a.contest,
  60.                 a.t,
  61.                 a.solver
  62. order by 1, 2;
  63. quit;
复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
yongyitian + 5 + 3 + 3 + 3 观点有启发

总评分: 论坛币 + 5  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

藤椅
teqel 发表于 2015-10-6 11:04:57
思路也是自己和自己join

板凳
teqel 发表于 2015-10-6 11:32:41
第二部分:
  1. data test2;
  2. set test1;
  3. array arr{9} a b c d e f g h i;
  4. n1=9-cmiss(of arr[*]);
  5. n2=sum(of arr[*]);
  6. average=n2/n1;
  7. tt=0;
  8. do j=1 to 9;
  9.         tt+(arr[j]-average)**2;
  10. end;
  11. con1=sqrt(tt/n1);
  12. con2=sqrt(tt/n2);
  13. drop tt j;
  14. run;
复制代码

报纸
winddr 发表于 2015-10-6 14:18:21
teqel 发表于 2015-10-6 11:32
第二部分:
十分感谢!
展示的数据中为了便于理解,我预先设置了a-i个solver。但是我的实际数据中solver的个数众多,事先并不知道solver的具体个数,且solver自由提交他们的方案。能否根据数据信息生成相应的solver列表并统计此列表中solver的实时出现次数,以此来计算两个集中度?

地板
winddr 发表于 2015-10-6 19:39:53
自己顶,盼大神出现

7
teqel 发表于 2015-10-6 19:58:55 来自手机
一个工作中的实际问题,自己一点不出力,完全靠网上无偿给出解决方案,是让人不能接受的

8
jingju11 发表于 2015-10-10 09:14:54
teqel 发表于 2015-10-6 19:58
一个工作中的实际问题,自己一点不出力,完全靠网上无偿给出解决方案,是让人不能接受的
you are right. thanks for your answer. JingJu
  1. proc sql;
  2. select distinct quote(cats(solver)) into :sList separated by ',' from test;
  3. select distinct cats(solver) into :vList separated by ' ' from test;
  4. select count(distinct solver) into :nList separated by ',' from test;
  5. quit;
  6. data x;
  7.         set test;
  8.         by contest;
  9.         array ss[&nList] $ _temporary_(&sList);
  10.         array cc[&nList] &vList;/*        if solver is valid sas name*/
  11.         if first.contest then call missing(of cc[*]);
  12.         cc[whichc(solver, of ss[*])] ++1;
  13.         n1 =n(of cc[*]); n2=sum(of cc[*]);
  14.         average =mean(of cc[*]);
  15.         cr1=sqrt(var(of cc[*])*(n1-1)/n1);
  16.         cr2=cr1*sqrt(n1/n2);
  17.         run;
复制代码

9
jingju11 发表于 2015-10-10 09:31:36
jingju11 发表于 2015-10-10 09:14
you are right. thanks for your answer. JingJu
one of my classmates suggests me a better way to assign values: JingJu
  1. cc[whichc(solver, of ss[*])] ++1;
复制代码

10
jingju11 发表于 2015-10-15 19:33:38
To Sunflower: 在如此的情形之下,数据步较之SQL有优势。京剧

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-22 04:42