本文收集了从一开始用stata软件至今的一些问题,很多看起来比较菜鸟,但相信对刚入门的同学也是非常有用的。回答基本来自人大经济论坛,解释权归其所有。我只是个搬运工~
因为本人预计相当长的时间内都要和stata打交道,所以这篇文章也会持续不定期更新~
排版可能有些粗糙……
合并数据库有两种方式,一种是增加观察,另一种是增加变量。
一种用append,用在两个数据库的格式一样,但观察不一样,只需用append空格 using空格(文件名)就可以狗尾续貂了。
另一种就不同了,需要格外小心。如果两个数据库中包含共同的观察,但是变量不同,希望从一台数据库中提取一些变量到另一台数据库中用merge。完整的命令如下:
use (文件名) [打开辅助数据库]
sort (变量名) [根据变量排序,这个变量是两个数据库共有的识别信息]
save (文件名), replace [保存辅助数据库]
use (文件名) [打开主数据库]
sort (变量名) [对相同的变量排序]
merge (变量名) using (文件名), keep((变量名))
[第一台变量名即为前面sort后面的变量名,文件名是辅助数据库的名字,后面的变量名是希望提取的变量名]
ta _merge [显示_merge的取值情况。_merge等于1的观察是仅主库有的,等于2的是仅辅助库有的,等于3是两个库都有的。]
drop if _merge==2 [删除仅仅来自辅助库的观察]
drop merge [删除_merge]
save (文件名), replace [将合并后的文件保存,通常另存]
<hr/>在stata中进行merge之后,如何把合并后的merge3保存出来成dta格式
keep if _merge == 3
<hr/>请教前辈,我的id变量数据是2005_10、2005_11、2006_17、2006_12、2007_18、2008_19这样的,想把这里面有2005,2006字眼的数据删除,应该用怎样的命令呢?
看起来id是字符型,如果要删除样本id中有2005,2006的数据可以用:
drop if strmatch(id, &#34;*2005*&#34;) | strmatch(id, &#34;*2006*&#34;)
<hr/>merge的时候为啥会提示variable _merge already defined????
(两次合并)
use fdata1.dta, clear
merge 1:1 Stkcd year using pdata2.dta, nogen
save finaldata, replace
<hr/>请问Stata用什么命令提取字符串变量前2个汉字或前n个汉字?
一台汉字占3位。
g x=substr(province,1,6)
<hr/>解决stata15中文乱码的问题
cd D:\stata15\ado\personal\mypaper
* Unicode all .dta files in CWD and files in sub-directories
. ua: unicode encoding set gb18030
. ua: unicode translate *.dta
* Unicode all files (.do, .ado, .dta, .hlp, etc.) in CWD and files in sub-directories
. ua: unicode encoding set gb18030
. ua: unicode translate *
多谢你的提示。根据你的转码的启示,我在stata中研究了一下Unicode命令可以很好的解决问题。
具体的步骤如下:
(1)打开stata15.0,不要打开任何数据文件,并提前把需要转化的数据文件放入stata的安装目录下(我的文件名为2013.dta)。
(2)输入命令:unicode analyze 2013.dta
(3)输入命令:unicode encoding set gb18030
(4)输入命令:unicode translate &#34;2013.dta&#34;, invalid(mark) transutf8
(5)友情提示,第(4)步中有两点需要注意,一是&#34;2013.dta&#34;千万不要忘了加“ ”号,二是在某些情况下加入invalid(mark)这个选项可以很好的解决意想不到的问题。使用连玉君老师编写的ua命令也需要注意这个问题。
(6)转换完的数据文件2013.dta,直接用stata15.0打开,已经很好的显示了中文名字。
<hr/>
STATA中的变量内数值替换问题
各位帮忙看看,我在STATA中想把var3 这个变量中的2 very satisfied 全部替换成1 completely satisfied
我是这么写代码的: replace var3==1 if var3==2,结果做不出来,高手麻烦指点一下
clear
inp id str20 var3
1 &#34;completely satisfied&#34;
2 &#34;very satisfied&#34;
end
replace var3=&#34;completely satisfied&#34; if id==2
stata中变量的数据中包含一台字符则添加另一台字符的命令是指什么呢
replace company=strcat(company,&#34;司&#34;) if strmatch(company,&#34;*公&#34;)
replace company=strcat(company,&#34;公司&#34;) if strmatch(company,&#34;*有限&#34;)
replace company=strcat(company,&#34;公司&#34;) if strmatch(company,&#34;*贸易&#34;)
<hr/>Stata如何输出文本型变量的字符长度?
g s0301a_length=strlen(s0301a)
//变量s0301a为股东名称,变量s0301a_length储存了变量s0301a的字节数
g hanzi4= cond( s0301a_length<= 12, 1, 0)
//在我用的Stata15中,一台汉字占3个字节,这里我用变量hanzi4将名称小于4个汉字的观测标记为1
*注:cond为虚拟变量产生函数,了解详情可help cond
如果需要把所有数据都变化格式的话,
就destring _all,replace force
<hr/>如何互换两列数据位置?
你指的是两个变量吗?若是
order weight, before(price)
<hr/>每当我输入 xtset code year 就会出现 varlist: code: string variable not allowed 到底如何了 下面是我的数据varlist: code: string variable not allowed
destring XXX, replace force
<hr/>定义面板数据时,出现repeated time values within panel 是如何回事,如何解决?谢谢大家。
tsset tfp year
repeated time values within panel
duplicates drop tfp year, force
tsset tfp year
<hr/>如何理解cluster?
如果cluster的目的在于处理行业面对共同因素的干扰,那么对于行业的cluster和直接控制i.industry 有什么不一样的呢
cluster(group) 的含义是:假设干扰项在 group 之间不相关,而在 group 内部存在相关性。
假设 group 代表行业类别,则表示行业间的公司所面临的随机干扰不相关,而行业内部不同公司间的干扰项存在相关性,或者是说,行业内的公司受到了一些共同的干扰因素。
截面组之间不相关,截面组内可存在相关性!
假如是面板数据,你是以哪个作为panel identify?行业或是公司?
先撇开其他的不说,vce(cluster id)只会影响标准误等,不会影响变量的系数。
稳健性的方差协方差只是影响SE,显著性,对系数没有影响!
<hr/>stata显示type mismatch r;如何处理
数据形式不匹配,转换一下数据形式,即字符型和数值型转换一下试试,用tostring 或者destring
<hr/>如何把数值型变量转换为字符型变量,我目前有一台数值型的变量a,要新建一台变量b,它的取值是变量a取值的前四个字符,请问应该如何编程?
首先将数值型转化为字符型tostring a,replace;然后取前四个字符,gen b=substr(a,1,4),就ok啦。
<hr/>关于stata里如何表示”或者“
&表示并且
| 表示或者
<hr/>显示变量频数
tab var
<hr/>Stata中如何删除有缺失值的记录?
egen m=rowmiss(_all)
drop if m>0
<hr/>stata中如何写命令将原本为缺失值“.”的换成0值
replace var1=0 if var1==.
好像可以这么做:
mvdecode var1-var5, mv(0=.)
mvencode var1-var5, mv(.=0)
如果用上述方法替换不了的话,可以采用强制替换命令:
mvencode _all, mv(0) override
<hr/>最近合并CHNS两个数据表遇到以下问题,请大家帮忙,我所用的命令是merge m:1 wave commid hhid line using m10wages,但却出现以下提示variables wave commid hhid line do not uniquely identify observations in the using data,我曾尝试加入省份变量或删掉commid,但是仍然不行,我大概查看了以下,感觉用wave hhid和line,三个变量就能确定是同一台样本,不知为啥不能合并,不知大家是如何合并的,请多多指教
先看看主数据中那些指定变量取值重复的样本:
bysort wave commid hhid line: egen dup=cond(_N>1, _n, 0)
br if dup~=0
bys 你认为的可以唯一定义一台样本的变量: egen a=_N
tab a
可以看到重复样本,a表示频率。
<hr/>面板数据中生成滞后变量可以直接用lag命令,若要生成一台变量的lead,应该怎样弄?
直接调用窗口来解决呀,在统计菜单中,panel data 中,linear regression 里面的 response valuable, 有个省略号的那个按钮,可以针对时间来选lag 和lead 的阶数的。。
---------------------------
help varlist
*可以看到算子一览
F.
L.
D.
S.
#
##
i.
c.
-----------------------------
请help tsvarlist
手册上的例子很清楚
webuse gxmpl1
list cpi F.cpi F2.cpi F3.cpi
我想这在面板数据里应当也是一样的
参考
webuse nlswork
xtset idcode (year)
list age F.age F2.age F3.age in 1/20
【您可以看到,加了F,好像在说,他一年后是几岁】
<hr/>
面板数据滞后一期的处理:xtset 样本变量(一般是区域变量) 时间变量名称,这一步运行后会显示面板变量、时间变量和delta 1 unit;第二步 gen 滞后一期变量的新名称=L.变量名称,命令运行后会显示消失了一年的数据个数。
<hr/>Root MSE
Root MSE即中文教材中的残差平方根. 残差平方(SS残差)是总变异中无法用回归的协变量解释的部分.该数值越小,说明回归的效果越好.该数值越大,说明回归的效果越差. 它的平方根意义相同. 同时,其意义可以反映在回归假设检验的P值上. 该数值越大, P值越大,该数值越小,P值越小.
除非是统计方面的研究论文, 一般不报告Root of MSE. 但它是评价回归效果好坏很有意义的指标.
============================
SSE, MSE,RMSE,R-square
SSE(和方差、误差平方和):The sum of squares due to error
MSE(均方差、方差):Mean squared error
RMSE(均方根、标准差):Root mean squared error
R-square(确定系数):Coefficient of determination
Adjusted R-square:Degree-of-freedom adjusted coefficient of determination
一、SSE(和方差)
该统计参数计算的是拟合数据和原始数据对应点的误差的平方和,计算公式如下
SSE越接近于0,说明模型选择和拟合更好,数据预测也越成功。接下来的MSE和RMSE因为和SSE是同出一宗,所以效果一样
二、MSE(均方差)
该统计参数是预测数据和原始数据对应点误差的平方和的均值,也就是SSE/n,和SSE没有太大的区别
三、RMSE(均方根)
该统计参数,也叫回归系统的拟合标准差,是MSE的平方根
在这之前,我们所有的误差参数都是基于预测值和原始值之间的误差(即点对点)。从下面开始是所有的误差都是相对原始数据平均值而展开的(即点对全)!!!
四、R-square(确定系数)
在讲确定系数之前,我们需要介绍另外两个参数SSR和SST,因为确定系数就是由它们两个决定的
(1)SSR:Sum of squares of the regression,即预测数据与原始数据均值之差的平方和,
(2)SST:Total sum of squares,即原始数据和均值之差的平方和,
其中,SST=SSE+SSR,“确定系数”是定义为SSR和SST的比值,
其实“确定系数”是通过数据的变化来表征一台拟合的好坏。由上面的表达式可以知道“确定系数”的正常取值范围为[0 1],越接近1,表明方程的变量对y的解释能力越强,这个模型对数据拟合的也较好
<hr/>结局变量(outcome variable)
也叫结果变量,简称为结局。是指研究所规定的预期的研究结果事件,常常需要随访观察一定时间才能出现。与研究的观察终止时间相区别。
<hr/>如何查看当前工作目录
local filename `=subinstr(&#34;`c(filename)&#39;&#34;,&#34;/&#34;,&#34;\&#34;,.)&#39;
while strpos(&#34;`filename&#39;&#34;,&#34;\&#34;)!=0 {
local filename `=substr(&#34;`filename&#39;&#34;, strpos(&#34;`filename&#39;&#34;,&#34;\&#34;)+1,.)&#39;
}
local current_path `=substr(&#34;`c(filename)&#39;&#34;,1,(strlen(&#34;`c(filename)&#39;&#34;)-strlen(&#34;`filename&#39;&#34;)-1))&#39;
cd &#34;`current_path&#39;&#34;
cdout
<hr/>求方差
sum a,detAIl
里面有Variance 87.87778
如果只是sum a,没有detail这个option 就只有观测值个数啦 均值啦 极值啦 标准差啦 没有方差
=====================
面板数据可用如下命令:
egen sdva =sd(va), by(year) 分别求每一年的方差
均值方差标准差
egen vmean=mean(vara),by(id)
egen vsd=sd(vara),by(id)
gen vstd=sqrt(vsd)
<hr/>在stata中使用ipolate命令补某个变量在某年的缺失值
ipolate的确是只能补中间缺漏值,面板数据的首尾缺漏可以使用by id:mipolate lnj year, gen(lnj1) linear epolate命令。
以xvar和yvar的线性关系对缺漏值进行线性插值,缺漏值比较多的时候用这个方法最好检查一下合不合理,一次线性插值误差蛮大的。
<hr/>将附件中的数据2003.csv导入stata中,可以看到有v1-v25共25个变量,其中v3和v12这两个变量含有字符串“Total”,我想保留这两个变量,而将其他列都删除,应该如何做?
注意,不是直接就是keep v3 v12这么简单,而是要编写程序能够自动搜索含有字符串“Total”的变量,将其保存下来并删除剩余的变量。
------------------
例如 我有一台字符串变量(string variable)&#34;nation“
其中包含CHIN AME FRA BRI KOR等等,我想利用那些国家名称中包含字母”C&#34;的观测值生产一台新的虚拟变量,可以吗?
<hr/>
数据库中的变量名为“名称”,有“丹红注射液”还有“丹红注射剂”等,我想把所有跟丹红相关的都keep下来,
ds,has(type string)
foreach i in `r(varlist)&#39;{
egen t=sum(strpos(`i&#39;,&#34;Total&#34;))
if !t drop `i&#39;
drop t
}
-----------------------------
*设nation中的字符串全部为大写
g c=(strpos(nation,&#34;C&#34;)>0)
------------
keep if strpos(x,&#34;丹红&#34;)>0
如果我只想让字符串的前两个字是“丹红”,这样改如何写呢?
keep if substr(x,1,4)==&#34;丹红&#34;
<hr/>stata输出表格的命令是啥?
esttab using xxx.rtf
可能要先安装ssc install estout, replace
在stata中如何使用系统变量_n来检查观测值的重复值
bys _all: g dupl=_n
keep if dupl==1
<hr/>各位,
Stata的判定一台字符串是否包含另一台的函数是指什么?
具体地说,我想搜索出所有名字中包含某个关键字的纪录,该如何办?
多谢帮助!
<hr/>另外,Stata字符串操作函数有哪些?
楼主,你可以试一下 regexm
indexnot()、strpos()
lookfor -- Search for string in variable names and labels
面板数据中,根据样本(id)和观测期(t)生成一台新变量number,其内容是每个样本的观测期个数,
inp id t
1 1991
1 1992
1 1993
2 1991
2 1992
3 1991
end
*方法一:
bys id: g number=_N
*方法二:
duplicates t id, g(number)
replace number=number+1
*方法三:
xtset id t
tsspell, f(L.t == .)
bys id: egen number=max(_seq)
*方法四:【这个比较像楼主原本的】
bys id:egen number=count(id<.)
<hr/>文章的基本回归用了reghdfe,后面要使用ivreghdfe做工具变量检验,但是该命令不支持VCE(cluster)的选项,要得到聚类稳健标准误的stata命令需要如何写?
sysuse auto
ivreghdfe price weight (length=gear), absorb(rep78, tol(1e-6)) cluster(rep78)
<hr/>如何统计工企数据库中样本数?
3,970,421
egen group=group(id)
summarize group
<hr/>Egen和gen的区别
Hello, the egen is an excellent stata command which is useful in particular for large database for which variables contain repeated sequence. It&#39;s used in general with other commands (by (id), ...).
You can see this document from stata journal 2006 for explanation and exemples.
<hr/>开平方根
是sqrt()
<hr/>要退出mata环境必须要用end,但是stata认为这个end表示我想要退出循环!因为循环也可以用end退出,这样的话我就没有办法在循环语句中引用mata环境。
使用mata mosave先将mata保存成.mo file,然后直接调用
mata计算部分写在一台do文件
循环里面do即可
关于mata
stata状态下,matsize最大是11000,mata状态下,没有这个限制。mata还有大量stata没有的函数与运算(特别是针对矩阵的)。
Description
Mata is a component of Stata. It is a matrix programming language that can be used interactively or as an extension for do-files and ado-files. Thus
1. Mata can be used by users who want to think in matrix terms and perform (not necessarily simple) matrix calculations interactively, and
2. Mata can be used by advanced Stata programmers who want to add features to Stata.
Mata has something for everybody.
Primary features of Mata are that it is fast and that it is C-like.
<hr/>例子1991年数据是缺失的tsline
如何让那条线不要连起来,就是在没有数值的位置断开?
=====================
那如果是批量作图,不知道断点在哪里呢?就是不同图里可能在不同位置有缺省值
tsset year
twoway (tsline x if year<1991) ///
(tsline x if year>1991)
=================
tsset year
twoway (tsline x , cmissing(n))
<hr/>stata命令:predict zg if e(sample), xb 这条命令什么意思呀?关键是e(sample), xb
if e(sample) 加上该条件是指用上一次回归中的样本观测值进行数据处理。相当于 if e(sample)==1 的条件语句。 predict 后面加xb是预测yhat,不加也可以。
===============
if e(sample) 等价于 if e(sample) == 1,表示只针对用于估计上一台模型的样本观测计算残差项。否则,默认的设置是对所有的样本观测计算残差。 直观的感受可以对比加了if条件和不加if条件的使用predict,然后观察残差项列的差异。
画图时将某个区间标注为阴影
sysuse sp500.dta, clear
tsset date
sum close
gen max = 1400 if tin(19mar2001, 25mar2001) | tin(02apr2001, 06apr2001) | tin(18sep2001, 24sep2001)
twoway (area max date, color(gs14) cmissing(n)) (line close date, color(black)), ///
yscale(range(900, 1400)) ///
xtitle(&#34;时间&#34;) ///
ytitle(&#34;收盘价格&#34;) ///
plotregion(margin(sides)) ///
scheme(s1mono) ///
legend(off)
注:tin命令是选择时间跨度的函数,全名为Selecting time-span functions,基本语法结构为tin(d1, d2),其中d1和d2分别指定两个时间点。
<hr/>目的是将ID==0的数据进行回归,然后取得该回归系数然后代入到ID==1的样本中,估计残差
能否将命令简化为上述, 如上述循环语句中,假设数据样本同时包括ID==0和ID==1两类数据结构,能否通过该命令实现对ID==1的样本的残差估计呢,也就是说在回归的时候没有ID==1的数据,但却要估计ID==1的样本的残差。
forvalues i = 1/$N{
qui reg `y&#39; `x&#39; if (sic123==`i&#39;) & ID==0
qui predict e if sic123==`i&#39;, res
qui replace D`y&#39; = e if sic123==`i&#39;
drop e
}
<hr/>想用wntestq命令检验白噪声,已经生成了残差,唯一还不明白的是变量里的lag该如何确定?
在help文件中,该命令的语法是:
wntestq varname [if] [in] [, lags(#)]
其中,中括号内的内容可以省略。
这意味着在使用该语句时,可以不规定滞后阶数,
此时Stata默认滞后阶数为min{floor(n/2)-2,40}
(此处floor表示向下取整)
<hr/>我从Excel表中将年龄数据粘贴到了stata中,不只为啥显示为红色字(即为字符型),我使用destring a103,replace的命令,结果显示a103 contains nonnumeric characters; no replace,然后仍然或是字符型的,我应该如何办才能转化为数值型
试一下encode varname, gen (newvarname)。varname是字符型变量,newvarname没问题的话就是转变后的数值型变量啦
======================
你这个例子里用encode处理字符变数字是不合适的。请看看Stata对encode的说明:encode creates a new variable named newvar based on the string variable varname, creating, adding to, or just using (as necessary) the value label newvar or, if specified, name. Do not use encode if varname contains numbers that merely happen to be stored as strings; instead, use generate newvar = real(varname) or destring; see real() or [D]destring.
这个说的很明白了,“Do not use encode if varname contains numbers that merely happen to be stored as strings; instead, use generate newvar = real(varname) or destring;”
至于你用destring为啥出现问题,你的错误提示说明,你那个变量里面存在非数字的字符。你应该仔细检查一下,变量里存在什么字符。如果你确认这个变量就应该是数字,可以直接转换的话。那么,可以在destring后面加上force参数
destring var, replace force
force参数的作用是“convert nonnumeric strings to missing values”
=======================
destring var2,force replace 这个命令不就行了 ?
要是直接用这个,对于是负数的内容会直接missing
================
<hr/>// 如何将stata中的字符型数据转为数值型
* Example generated by -dataex-. To install: ssc install dataex
clear
input str5 t str1 gz
&#34;C &#34; &#34;Y&#34;
&#34;A++ &#34; &#34;N&#34;
&#34;B &#34; &#34;N&#34;
&#34;A+ &#34; &#34;N&#34;
&#34;C &#34; &#34;Y&#34;
&#34;A &#34; &#34;N&#34;
&#34;A- &#34; &#34;N&#34;
&#34;C &#34; &#34;N&#34;
&#34;A &#34; &#34;N&#34;
&#34;- &#34; &#34;Y&#34;
&#34;C &#34; &#34;N&#34;
&#34;B &#34; &#34;N&#34;
&#34;C- &#34; &#34;N&#34;
end
// Daniel Bela
label define ratings 1 &#34;A++&#34; 2 &#34;A+&#34; 3 &#34;A&#34; 4 &#34;A-&#34; 5 &#34;B&#34; 6 &#34;C&#34; 7 &#34;C-&#34; .a &#34;-&#34;
replace t = trim(itrim(t))
encode t, generate(t_code) label(ratings) noextend
label define yesno 1 &#34;Y&#34; 0 &#34;N&#34;
replace gz = trim(itrim(gz))
encode gz, generate(gz_code) label(yesno) noextend
// Marcos Almeida
encode t, gen(t1)
codebook t1
gen t2 = t1
recode t2 (2=3 &#34;A&#34;) (3=2 &#34;A+&#34;) (4=1 &#34;A++&#34;) (5=4 &#34;A-&#34;) (6=5 &#34;B&#34;) (7=6 &#34;C&#34;) (8=7 &#34;C-&#34;) (miss=.), gen(t3)
codebook t3
gen gz1 = (gz == &#34;Y&#34;)
invnormal(p)
<hr/>stata中常用的概率函数。
invnormal(p)累计标准正态分布的逆运算。如果normal(z)=p,有invnormal(p)=z。
uniform()伪随机数发生器,获取区间0到1内理论均匀分布的返回值。
<hr/>gsort:与sort只能进行顺序排序不同,gsort可以同时进行多个变量之间的顺序和倒序排序结合。
*varname可以是数值或字符串;变量名前不加或者加+表示顺序;变量名前加-表示该变量进行倒序
gsort [+|-] varname [[+|-] varname ...] [, generate(newvar) mfirst]
[,]:中括号里的为额外选项命令,按需求添加,而添加选项记得加英文逗号,
- generate(newvar):添加该选项,生成新变量,变量内容为1,2,3,……的顺序数。
- mfirst:添加该选项,降序排序时将缺失值放在最前面而不是默认的最后面。
<hr/>real()函数
real(s) 可以将以字符型格式储存的数值变量s转化为数值型变量。real(s) 返回的值为数值(以字符型格式储存的数值变量)或缺失值(以字符型格式储存的非数值变量)。- }9 q0 P2 ]6 u8 Z* _
例如:* p, R/ f$ b6 X% O- e&#39; n4 n
real(&#34;5.2&#34;)+1 = 6.2&#34; q R5 M2 J& I6 z
real(&#34;epiman&#34;) = .( Y! {&#39; I+ R&#39; e
&#34; w c b/ P w! v5 x& H) Q
<hr/>【Stata tips: mata数据的输入与输出】
首先如何将Stata的数据输入mata:st_view()和st_data。这两个命令的作用是一样的,但是从效果上还有细微差别。st_view()可以生成一台当前在内存中的Stata数据的矩阵,你可以对这些矩阵进行任何运算,但是当Stata的数据改变以后,这个矩阵也会改变;而st_data()则不然,他会生成一台绝对独立的矩阵,不论你Stata的数据如何改变,这个mata中的矩阵依然如故。比如st_view(X=.,.,.)会将当前数据中变成mata中的一台矩阵X,但是当你clear之后在进入mata,这个矩阵X的所有元素都变成“.”了。相反的,X=st_data(.,.,.)也将目前内存中的Stata数据变成一台矩阵,但是无论这个数据是否还在,都不影响这个矩阵的取值。据说之所以设计st_view()的原因是这样比较节省内存。不过这两个命令的共同之处是,如果变量是一台字符型的话,进入mata以后就变成“.”了。
再来看Stata中的矩阵和标量如何进入mata: st_matrix()和st_numscalar()。比如目前Stata中有一台矩阵A和一台数值型标量a,那么B=st_matrix(&#34;A&#34;)和b=st_scalar(&#34;a&#34;)就会在mata中生成对应的矩阵和数值型标量。如果这个标量是字符型的,则需要命令st_strscalar(),如果仍然使用st_numscalar()的话,该标量进入mata之后,就变成一台0行0阶的矩阵。
最后再看看宏如何进入mata: st_local()和st_global()。与上面两个命令类似,如果Stata中有一台叫作X的宏,那么A=st_local(&#34;X&#34;)或者A=st_global(&#34;X&#34;),都会在mata中生成一台字符型的标量。比如宏X的值是数字12,进入mata以后就变成字符12了,也就是说这个时候不能进行数值运算了。
看完输入,再来看看如何输出。
输出成一台变量最麻烦,需要用到两个命令:st_addvar()和st_store()。比如mata中有一台矩阵N*K的矩阵Y,目前将其输出到Stata中,类型为“long”,并取名为X1,X2,...,XK。比如K=3,那么就要这么操作:
index=st_addvar(&#34;long&#34;,(&#34;X1&#34;,&#34;X2&#34;,&#34;X3&#34;))
st_addobs(rows(Y))
st_store((1,rows(Y)),index,Y)
其中st_addobs(rows(Y))的作用是将Stata数据中的obs设定为这个矩阵的行数。缺少这一步,Stata可能会报告出错。
输出矩阵就容易多了,st_matrix(&#34;r(A)&#34;,A)将矩阵输出到r(A)中,st_matrix(&#34;e(A)&#34;,A)将矩阵输出到e(A)中。st_numscalar()、st_strscalar()、st_local()以及st_global()的用法与此类似。
其实这些命令还有很多种变体,不过掌握这些基本用法以后,其他的很快都会学会。
<hr/>我需要同时从矩阵中产生多个变量储存在stata中,有点类似于一台循环语句,我目前这样写,假设我在mata中已经存储了一台n*k的矩阵x,我想生成k个变量,即x的每一列
i=1
n=k
while (i<=k) {
y=.
st_subview(y,x,.,i)
st_addobs(rows(y))
st_addvar(&#34;float&#34;, &#34;t&#34;) /*关键就是这步和下一步,如何用st_addvar循环生成多个变量,我目前的做法只能生成一台变量t,如果我想通过循环生成t1 t2....到tk,应该怎样做
st_store(., &#34;t&#34;,y)
i++
}
答:
*一台比较粗浅的作法:
*(1)在stata中
. set obs n
*(2)用generate生成k个变量(变量名自个随意定),不妨令它们都只有缺失值
*(3)进入mata,生成n*k矩阵m
*(4)使用st_store()
: st_store(.,.,m)
: end
*mata中的m的值便把stata中的k个变量的值代换了。
*一台比上面稍微复杂的例子(注意st_store()中各值对结果的作用):
clear all
inp a b c d e
. . . . .
. . . . .
. . . . .
. . . . .
end
mata
z=(1,2\3,4)
st_store((2,3),(&#34;a&#34;,&#34;b&#34;),z)
end
list
st_store(a,b,c)的关键是:
(1)a、b、c都是mata中的向量;
(2)以a与b在stata当前数据库中定义出一台“观测值区域”,该区域须与c同型;
(3)以c中的值替换该区域的值。
*不用循环
clear all
set ob 30
mata
a=uniform(30,5)
st_store(.,st_addvar(&#34;float&#34;,(&#34;x1&#34;,&#34;x2&#34;,&#34;x3&#34;,&#34;x4&#34;,&#34;x5&#34;)),a)
end
*用循环
clear all
set ob 30
mata
a=uniform(30,5)
for(i=1;i<=5;i++) st_store(.,st_addvar(&#34;float&#34;,&#34;x&#34;+strofreal(i)),a[.,i])
end |