查看原文
其他

Stata模拟构建朋友圈

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:王碧琪

文字编辑:张馨月

技术总编:李朋冲


教育实践中,老师会把一个成绩不好或者品行不端的学生,安排在好学生周围,期望“坏学生”会在“好学生”的带动下,变得好起来。这种实践究竟有无效果,学术界并无定论。有学者认为,同伴效应对学生的成绩有促进作用,“坏学生”会模仿“好学生”的习惯和行为;也有学者认为,同伴效应对学生的成绩没有促进作用,“坏学生”并不认为“好学生”是值得学习的榜样,依然我行我素。为了研究同伴效应对学生的成绩或在校表现的影响,需要找到学生的朋友圈,分析朋友圈的构成。现实生活中,有的学生人缘很好,有的学生却人缘极差,那么每个学生平均拥有多少朋友呢?我们使用Stata模拟构建朋友圈,让100个人随机找朋友,并比较他们的朋友圈的大小。

(一)构造每个人选择的前三个朋友

首先生成100个姓名,每个姓名代表一个学生,名为An(n是编号1-100)。

clearset obs 100gen name = "A"+string(_n)



接下来,使用post命令定义一个邮局系统,名为friends。里面有一个信封,叫做friends.dta,用来存放信息。这里把每个人的名字name以及他的三个好朋友的名字f1、f2、f3放进去。

postfile friends str5 name str5 f1 str5 f2 str5 f3 using friends.dta, replace

对于A1来说,先将他本身剔除,再去找三个朋友(利用sample命令随机抽取三个人),最后把找到的三个人的名字post出去。命令如下:

drop if name == "A1"sample 3, countpost friends ("A1") (name[1]) (name[2]) (name[3])postclose friendsuse friends, clearbr

类似地,对于100个人,只需套用一层循环即可。

postfile friends str5 name str5 f1 str5 f2 str5 f3 using friends.dta, replaceforvalues i = 1/100{ preserve drop if name == "A`i'" sample 3, count post friends ("A`i'") (name[1]) (name[2]) (name[3]) restore}postclose friendsuse friends, clearbr



部分结果如上图所示。数据显示成功构造出100个人,并且分别让每个人找到了3个朋友。

(二)查看哪个同学的人缘最好

接下来小编想知道,哪个同学人缘最好(拥有的朋友最多),这里通过下面的思路实现。定义一个名为pop_f的邮局系统,其中的信封名为pop_f.dta,信封中的内容包含每个人的姓名name及他所拥有的好朋友数量number。这就是最终的目标信息。
仍然先对A1处理,再扩展到100个人。如果f1等于A1(即第一个好朋友是A1),那么就生成一个新变量为1,否则为0。再对f2、f3做同样的判断。对于每一个人,把生成的新变量加和,得到这个人是否把A1看作好朋友。最后把所有人的计数变量加总,得到把A1看作好朋友的人数。通过下面的命令实现:

use friends.dta, cleargen f1_d = (f1 == "A1")gen f2_d = (f2 == "A1")gen f3_d = (f3 == "A1")gen x = f1_d + f2_d + f3_dgen y = sum(x)

同样,对于100个人,定义一层循环。

clear allpostfile pop_f str5 name number using pop_f.dta, replaceforvalues i = 1/100{ use friends.dta, clear gen f1_d = (f1 == "A`i'") gen f2_d = (f2 == "A`i'") gen f3_d = (f3 == "A`i'") gen x = f1_d + f2_d + f3_d //此处默认f1、f2、f3的重要程度相同,权重都为1 gen y = sum(x) post pop_f ("A`i'") (y[_N])}postclose pop_fuse pop_f, clearbr



从上面的结果看出,pop_f.dta里盛放了每个人以及他拥有的好朋友的数量,按照A1-A100依次排序。数据显示,有的人拥有7个好朋友,而有的人却只拥有1个。为了研究学生拥有几个好朋友是最常见的,使用以下命令:

use pop_f, clearsum numberforvalues n = `=r(min)'/`=r(max)'{ di `n' count if number == `n'}



结果显示,人缘最差的(在100人中拥有0个好朋友)有6人,人缘最好的(在100人中拥有7个好朋友)有4人,大部分人拥有1-4个好朋友。
另外,值得注意的是,在计算朋友总数时默认每个好朋友的权重为1,而在现实生活中并非如此。朋友也有亲疏远近之分,放在第一位的权重比第三位的大些,这体现出一个人在其他人心中的重要程度。所以通过给三位好朋友赋予不同的权重,可以得到一个人的加权朋友数量。
以上就是今天的Stata应用,模拟构造出100人的朋友圈,并比较朋友圈的大小。灵活使用Stata,可以模拟场景、解决困难、将抽象的问题具体化,让答案清晰明了地呈现出来。大家可以尝试多多应用Stata,之后我们也将继续活用Stata程序,持续为您答疑解惑~~~

 


对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
一个粉丝的疑惑—— local和scalar

新的一年,效率满满~(下)

自科基金项目信息爬取

rename group批量修改变量名

小命令,大不同——insobs插入新值

新的一年,效率满满~(上)

圆蛋快乐
BvD最后一弹——宏观数据宝典
一招搞定并购数据
多图“预警”(二)

您的圣诞礼物到了,请注意查收

BvD数据库介绍之Oriana

frlink:让连接更具“目的性”

多图“预警”(一)

Selenium的等待方式
一举拿下函数图像
BvD数据库介绍之Osiris

关于我们

微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存