查看原文
其他

玩转Stata中的数学函数

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

本文作者:邱   沣, 河南大学经济学院

本文编辑:温和铭

技术总编:李婷婷

Stata&Python云端课程来啦!

为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》。关于Stata,爬虫俱乐部推出了系列课程,内容包括字符串函数、正则表达式、爬虫专题和文本分析,可以随心搭配,价格美丽,物超所值,更多信息可查看Stata系列推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程》等。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦



导读

Stata作为一款声名远扬的统计分析软件,怎么能少了数学函数的使用呢?今天我们就一起来看一看Stata加上数学函数会有怎样的火花呢?

接下来我们从五个方面来展开介绍Stata中我们常用的那些数学函数。


01指数函数和对数函数
  • exp(x)--指数函数  

  • ln(x)--自然对数函数  

  • log10(x)--以10为底的对数函数

  关于指数和对数函数我们下面来举几个例子。
di exp(1)
di ln(exp(6))
di log10(100)

除了exp(x)、ln(x)、log10(x)外,还有一些其它与指数函数和对数函数相关的函数。
  • expm1(x) -- 返回e^x-1, 在|x|值较小时,它比直接输入exp(x)-1有更高的精度
  • ln1m(x) -- 返回ln(1-x)
  • ln1p(x) -- 返回ln(1+x)
  • cloglog(x) -- 返回ln{-ln(1-x)}。x的范围为(0,1)
  • invcloglog(x) -- 返回1 - exp{-exp(x)},“inv”表示其为cloglog(x)的反函数
  • logit(x) -- 返回ln{x/(1-x)}。x的范围为(0,1)
  • invlogit(x) -- 返回exp{1+exp(x)},logit(x)的反函数

下边我们也举例来看一下这几个函数的运算:

clear
set obs 5
gen x=_n
gen y1=exp(x)
gen y2=expm1(x)
gen y3=invcloglog(x)
gen y4=ln(x)
gen y5=ln1m(x)
gen y6=ln1p(x)
list


02绝对值和取整函数
  • abs(x) -- 返回 x 的绝对值,例如 di abs(-3.14)为 3.14
  • ceil(x) -- 返回大于等于X的最小整数,如 n<X<n+1 时,返回值为整数 n+1
  • floor(x) -- 返回小于等于X的最小整数,如 n<X<n+1 时,返回值为整数 n
  • round(x,y) or round(x) -- round(x,y)指对x进行四舍五入操作,y可以设定四舍五入的位数;比如di round(4.2,1)表示四舍五入到个位,为5,di round(4.234,0.1)表示四舍五入到十分位,为4.2。round(x,y) 还有一些特殊用法,代表最接近x的y的整倍数的数。比如di round(28,5)为 30 , 这表示的就是返回到 28 最接近的 5 的倍数的值,也就是 30 。而 round(x) 指的是对x四舍五入,但只保留整数。
  • int(x) -- 取整函数,即x略去小数点后的整数。
  • trunc(x) -- trunc(x)与 int(x)类似
下边我们举例看一下这几个函数的运算:
clear all
set obs 10
gen v1 = -5+10*uniform()
gen v2 = abs(v1)
gen v3 = ceil(v1)
gen v4 = floor(v1)
gen v5 = round(v1)
gen v6 = round(v1,0.01)
gen v7 = int(v1)
list


03求和函数——sum

在使用sum函数的时候,我们最常把它和gen、egen搭配使用,但是,sum函数在gen和egen命令中的使用效果是不同的,接下来我们就看一下它们和sum搭配分别是怎样使用的呢?

clear
set obs 6
gen x=int(10*uniform()) //生成0-9的随机整数
gen y=sum(x)
egen z=sum(x)
list

我们对比一下 y 和 z 可以看出gen和sum函数搭配使用得到的是列累积和(即x依次累加的和)而egen和sum函数搭配使用得到的是列总和(即所有x相加的和),其为一个定值而不像 gen 得到的是一个变动值。

egen使用的是专属函数来为新变量计算变量值,如mean()、rowmean()、rowsd()等,并且egen函数只能在egen命令下使用,不能用在gen的表达式中。在我们之前的推文《gen与egen,傻傻分不清楚?》中,有为大家详细介绍过gen和egen的区别,大家可以了解一下哦~

04factorial和gamma函数
  • lnfactorial(n) -- 返回n阶乘的自然对数——ln(n!)由于溢出问题,求阶乘的对数通常比阶乘本身更有用。当使用factorial(n)时,n>170时,返回缺失值,而对于lnfactorial(n),当n>1e+305时,才会返回缺失值。
  • lngamma(x) -- 返回gamma函数的自然对数
    (1)伽玛函数(Gamma Function)作为阶乘的延拓,是定义在复数范围内的亚纯函数。  

    在实数域上伽玛函数定义为:

    在复数域上伽玛函数定义为:

    其中RE(z)>0

    (2)在gamma函数中:当参数x是正整数时,函数的值就是前一个整数的阶乘。所以当x为正整数时,lngamma(x)=ln( (x-1)!)=lnfactorial(x-1)。如果x<0(这里 x 不能为负整数,如果 x 为负整数,返回值为缺失值),返回的是一个数值。所以,我们可以用exp(lngamma(x))来得到gamma(x)函数的绝对值。

  • digamma(x) -- 返回lngamma(x)的一阶导数
  • trigamma(x) -- 返回lngamma(x)的二阶导数
05其它函数
  • sqrt(x) -- 求x的平方根,x为非负数。比如di sqrt(4),我们会得到结果为2
  • comb(n,k) -- 从n中取k个元素的所有组合的个数,也就是二项式系数:n!/{k!(n - k)!}
  • max(x1,x2,...,xn) -- 求 x1,x2,...xn中的最大值
  • min(x1,x2,...,xn) -- 求 x1,x2,...xn中的最小值,当xn中有缺失值时,忽略缺失值。
  • mod(x,y) -- 取 x 除以 y 的余数,需要注意的是 mod(x,y) 只能在除数 y>0 的条件下才能求余。当除数y为0或者为负数时,返回值为“ . ”。这个命令在处理数据中会经常用到,比如当我们想保留特定行的观测值时:
keep if mod(_n,2)==1  这样我们就会保留奇数行的内容。
  • reldif(x,y) -- 计算 x 、y 的相对差异值即:reldif(x,y)=|x-y|/(|y|+1) 值得注意的是,当x和y都是相同类型的缺失值,则返回值为0;当只有一个为缺失值或x,y为不同类型的缺失值,则返回缺失值。 比如disp reldif( . , . ) 返回0,disp reldif( . , .x )返回"."
  • sign(x) -- 符号函数,x<0 时,返回值为-1;x=0时,返回值为 0;x>0 时,返回值为1;x 为缺失值时,返回值为缺失值。


案例说明:我们利用系统自带的auto数据,为了便于观察我们只列出了前10个观测值:

clear all
sysuse auto
keep price mpg rep78
keep in 1/10
gen dif1=reldif(price,mpg)
gen dif2=reldif(price,rep78)
list

我们保留了价格,里程数,和维修记录三项,然后分别计算价格,里程数,和维修记录的相对差异值。结果如下:

我们可以用这两个差异值来简单衡量汽车的性价比,dif1越小代表着相同价格下里程数更多,dif2越小代表着相同价格下维修次数越多。dif1越小、dif2越大代表性价比越高。

接下来我们选择一个数字作为基准数来筛选性价比不达标的汽车。

replace dif1=dif1-246.1429
gen v1=sign(dif1)
list

可以看到当v1=1时,说明汽车性价比低于我们的预期了。

以上就是今天要和大家分享的内容了,如果大家还有什么要补充或者想要了解的,欢迎留言!

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。

欢迎大家点赞、转发、评论哦!

对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!

往期推文推荐
         用spmap看中国空气质量

戳穿围城面具:安利&劝退一个专业

走进图文并茂的攻略世界 

玩转word文档“大变身”——wordconvert

数据读入|一文读懂用Stata读入不同类型的数据

简述递归

OpenCV库——轻松更换证件照背景色

800万年薪!还有谁?!

千古伤心词人,词伤几何?

去哪儿网攻略爬取——跟我一起去大理吧

"有你才有团"——Stata爬取王者荣耀英雄海报

爬虫实战|嚣张的徽州宴老板娘错在哪?

如何获取衡量股民情绪的指标?|东方财富股吧标题爬虫

利用Python构建马科维茨有效边界

rangestat,让统计量灵活滚动起来!

听说这样做立项成功率更高哦

如何处理缺失值?这一篇搞定!

善用dataex命令,高效沟通你我他

用Markdown制作简历,强力助力你的求职季

大数据下的大学分数线排行榜,快来围观!

《觉醒年代》—带你回到百年前

用Stata画的三维图很奇怪怎么办?

如何随机生成满足特定数据特征的新变量?

爬取无法翻页网页——自然科学基金项目及可视化

爬取京东评论数据进行情感分类

Stata与音乐之间的酷炫连接

这些年,爬虫俱乐部走出的博士们!
看这里,近五年各校高被引论文上榜名单!

高校经管类核心期刊发文排行榜

疯狂的科研创新加速器——Stata!

可盐可甜,“粽”有所爱,快来pick你最爱的粽子吧!

关于我们 


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



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

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




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

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