<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[SAS]]></title><description><![CDATA[SAS]]></description><link>https://actuarygarden.com/category/24</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 20:48:03 GMT</lastBuildDate><atom:link href="https://actuarygarden.com/category/24.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 25 Sep 2020 04:48:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[SAS相关书籍推荐]]></title><description><![CDATA[<p dir="auto">附件是我觉得比较好用的一些SAS相关书籍，在此推荐给大家。<br />
<strong>注：仅供学习使用</strong></p>
<p dir="auto">书目下载链接如下：</p>
<ul>
<li><a href="/assets/uploads/files/1601008242352-the-little-sas-book-%E4%B8%AD%E6%96%87%E7%89%88.pdf">The Little SAS Book 中文版.pdf</a></li>
<li><a href="/assets/uploads/files/1601008263143-the-little-sas-book-4th%E9%AB%98%E6%B8%85.pdf">The Little SAS Book(4th高清).PDF</a></li>
<li><a href="/assets/uploads/files/1601009138724-%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90sas-%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86-%E5%88%86%E6%9E%90%E4%BC%98%E5%8C%96%E4%B8%8E%E5%95%86%E4%B8%9A%E5%BA%94%E7%94%A81.pdf">深入解析SAS  数据处理、分析优化与商业应用1.pdf</a></li>
<li><a href="/assets/uploads/files/1601009265913-%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90sas-%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86-%E5%88%86%E6%9E%90%E4%BC%98%E5%8C%96%E4%B8%8E%E5%95%86%E4%B8%9A%E5%BA%94%E7%94%A82.pdf">深入解析SAS  数据处理、分析优化与商业应用2.pdf</a></li>
<li><a href="/assets/uploads/files/1601008569641-sas%E7%BB%9F%E8%AE%A1%E5%88%86%E6%9E%90%E4%B8%8E%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98.pdf">SAS统计分析与数据挖掘.pdf</a></li>
<li><a href="/assets/uploads/files/1601008596424-sas%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF%E4%B8%8E%E9%87%91%E8%9E%8D%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86.pdf">SAS编程技术与金融数据处理.pdf</a></li>
<li><a href="/assets/uploads/files/1601008611170-sas-sql-procedure-user-x27-s-guide.pdf">SAS SQL Procedure：User's guide.pdf</a></li>
<li><a href="/assets/uploads/files/1601008611170-sas-sba-jj-all-cases-combined-since-15.12.2015.pdf">SAS SBA JJ all cases combined since 15.12.2015.pdf</a></li>
<li><a href="/assets/uploads/files/1601008611170-sas-macro-programming-made-easy.pdf">SAS Macro Programming Made Easy.pdf</a></li>
</ul>
<p dir="auto">其中， 《The little SAS Book》是目前而言，新手入门推荐最多的，中英文版均可下载；《深入解析SAS》是我一直作为工具书备查的，SAS自带的SAS Help也很全面和好用，但是因为是全英文，有些不喜欢看英文的朋友或新手可能不太习惯。上述的书属于比较全面的教程，而其它几本书都是有侧重的，可以选看。</p>
]]></description><link>https://actuarygarden.com/topic/116/sas相关书籍推荐</link><guid isPermaLink="true">https://actuarygarden.com/topic/116/sas相关书籍推荐</guid><dc:creator><![CDATA[guohangjs]]></dc:creator><pubDate>Fri, 25 Sep 2020 04:48:13 GMT</pubDate></item><item><title><![CDATA[按照某个变量的值拆分数据集（为循环和批量分析服务）]]></title><description><![CDATA[<p dir="auto">/*按照变量date的值来拆分数据集<br />
如date=19960131生成一个数据集，date=19960228生成一个<br />
现在有很多个，到20080731了<br />
*/<br />
/*方法一<br />
思路是先把distinct date的值变为宏变量，然后用data步输出。<br />
反复读数据，会很慢<br />
*/<br />
data a;<br />
do date=1991 to 2011;<br />
output;<br />
end;<br />
run;<br />
data <em>null</em>;<br />
set a end=last;<br />
call symputx('date'||left(<em>n</em>),date);<br />
if last then call symput ('n',<em>n</em>);<br />
run;<br />
%macro split;<br />
%do i=1 %to &amp;n;<br />
data b&amp;i;<br />
set a;<br />
where date=&amp;&amp;date&amp;i;<br />
run;<br />
%end;<br />
%mend;<br />
%split;</p>
<p dir="auto">/<em>方法二</em>/<br />
data date;<br />
date=input("19960131",yymmdd8.);<br />
output;<br />
date=input("19960228",yymmdd8.);<br />
output;<br />
date=input("19960309",yymmdd8.);<br />
output;<br />
run;</p>
<p dir="auto">data <em>null</em>;<br />
set date;<br />
call execute ("data data_"||strip(put(date,yymmddn8.))||";set a;if date="||date||";run;");<br />
run;</p>
<p dir="auto">/<em>方法三</em>/</p>
<p dir="auto">data a;<br />
format target_day $8.;<br />
input target_day $;<br />
cards;<br />
20120730<br />
20120731<br />
20120810<br />
20120817<br />
;run;</p>
<p dir="auto">%macro segmentation();<br />
proc sort data = a out = work.t1(keep = target_day) nodupkey;<br />
by target_day;<br />
run;<br />
data <em>null</em>;<br />
set work.t1 nobs=n;<br />
call symputx(compress("set_"||<em>n</em>), put(input(target_day, yymmdd8.), yymmddn8.));<br />
if <em>n</em> = 1 then call symputx('n',n);<br />
run;<br />
data %do ii = 1 %to &amp;n.;<br />
data_&amp;&amp;set_&amp;ii..<br />
%end;;<br />
set a;<br />
select (target_day);<br />
%do ii = 1 %to &amp;n.;<br />
when ("&amp;&amp;set_&amp;ii..") output data_&amp;&amp;set_&amp;ii..;<br />
%end;<br />
otherwise;<br />
end;<br />
run;<br />
proc sql;<br />
drop table work.t1;<br />
quit;<br />
%mend;<br />
%segmentation();</p>
]]></description><link>https://actuarygarden.com/topic/23/按照某个变量的值拆分数据集-为循环和批量分析服务</link><guid isPermaLink="true">https://actuarygarden.com/topic/23/按照某个变量的值拆分数据集-为循环和批量分析服务</guid><dc:creator><![CDATA[谢远涛]]></dc:creator><pubDate>Mon, 25 May 2020 01:24:30 GMT</pubDate></item><item><title><![CDATA[SAS结果仿STATA输出&amp;内生性问题]]></title><description><![CDATA[<pre><code>ods rtf file="D:\_云同步\_论文\20171215税收对收入流动性\1_1家庭税收总额作为核心自变量.rtf";
proc syslin data=family LIML;
endogenous  incstr;
instruments tax_level urban jobclass_hz labor;
MN_1: model  MT= labor labor2  Incstr  asset  house  meaneduy  experience_hz  experience_hz2  tax_new;
ODS OUTPUT ParameterEstimates =MN_1;
RUN;
</code></pre>
<pre><code>proc syslin data=family LIML;
endogenous  incstr;
instruments tax_level urban jobclass_hz labor;
MN_2: model MT= labor labor2  Incstr  asset  house  meaneduy  experience_hz  experience_hz2  tax_new  tax_new2;
ODS OUTPUT ParameterEstimates =MN_2;
RUN;
</code></pre>
<pre><code>proc syslin data=family LIML;
endogenous  incstr;
instruments tax_level urban jobclass_hz labor;
MN_3: model MT=labor labor2  Incstr  asset  house  meaneduy  experience_hz  experience_hz2  tax_tod;
ODS OUTPUT ParameterEstimates =MN_3;
RUN;
proc syslin data=family LIML;
endogenous  incstr;
instruments tax_level urban jobclass_hz labor;
MN_4: model MT= labor labor2  Incstr  asset  house  meaneduy  experience_hz  experience_hz2  tax_tod  tax_tod2;
ODS OUTPUT ParameterEstimates =MN_4;
RUN;
proc syslin data=family LIML;
endogenous  incstr;
instruments tax_level urban jobclass_hz labor;
MN_5: model MT= labor labor2  Incstr  asset  house  meaneduy  experience_hz  experience_hz2  tax_old;
ODS OUTPUT ParameterEstimates =MN_5;
RUN;
proc syslin data=family LIML;
endogenous  incstr;
instruments tax_level urban jobclass_hz labor;
MN_6: model MT=labor labor2  Incstr  asset  house  meaneduy  experience_hz  experience_hz2  tax_old  tax_old2;
ODS OUTPUT ParameterEstimates =MN_6;
RUN;
ods rtf close;
</code></pre>
<pre><code>/*Tax_new Tax_old 出现共线性 tax_old        = +1.0000 * tax_new +1.0000 * shock3                                                           */
data MN_1;
	rename Variable=Parameter;
	length Variable  $15;
	set MN_1;	
	attrib param label='M1' length=$20;
	if Probt&lt;=0.01 then param=strip(put(estimate,6.3))||' ***  ('||strip(put(Estimate/StdErr,6.2))||')';
	else if Probt&lt;=0.05 then param=strip(put(estimate,6.3))||' **  ('||strip(put(Estimate/StdErr,6.2))||')';
	else if Probt&lt;=0.1 then param=strip(put(estimate,6.3))||' *  ('||strip(put(Estimate/StdErr,6.2))||')';
	else param=strip(put(estimate,6.3))||'  ('||strip(put(Estimate/StdErr,6.2))||')';
run;
data MN_2;
	rename Variable=Parameter;
	length Variable  $15;
	set MN_2;	
	attrib param label='M2' length=$20;
	if Probt&lt;=0.01 then param=strip(put(estimate,6.3))||' ***  ('||strip(put(Estimate/StdErr,6.2))||')';
	else if Probt&lt;=0.05 then param=strip(put(estimate,6.3))||' **  ('||strip(put(Estimate/StdErr,6.2))||')';
	else if Probt&lt;=0.1 then param=strip(put(estimate,6.3))||' *  ('||strip(put(Estimate/StdErr,6.2))||')';
	else param=strip(put(estimate,6.3))||'  ('||strip(put(Estimate/StdErr,6.2))||')';
run;
data MN_3;
	rename Variable=Parameter;
	length Variable  $15;
	set MN_3;	
	attrib param label='M3' length=$20;
	if Probt&lt;=0.01 then param=strip(put(estimate,6.3))||' ***  ('||strip(put(Estimate/StdErr,6.2))||')';
	else if Probt&lt;=0.05 then param=strip(put(estimate,6.3))||' **  ('||strip(put(Estimate/StdErr,6.2))||')';
	else if Probt&lt;=0.1 then param=strip(put(estimate,6.3))||' *  ('||strip(put(Estimate/StdErr,6.2))||')';
	else param=strip(put(estimate,6.3))||'  ('||strip(put(Estimate/StdErr,6.2))||')';
run;
data MN_4;
	rename Variable=Parameter;
	length Variable  $15;
	set MN_4;	
	attrib param label='M4' length=$20;
	if Probt&lt;=0.01 then param=strip(put(estimate,6.3))||' ***  ('||strip(put(Estimate/StdErr,6.2))||')';
	else if Probt&lt;=0.05 then param=strip(put(estimate,6.3))||' **  ('||strip(put(Estimate/StdErr,6.2))||')';
	else if Probt&lt;=0.1 then param=strip(put(estimate,6.3))||' *  ('||strip(put(Estimate/StdErr,6.2))||')';
	else param=strip(put(estimate,6.3))||'  ('||strip(put(Estimate/StdErr,6.2))||')';
run;
data MN_5;
	rename Variable=Parameter;
	length Variable  $15;
	set MN_5;	
	attrib param label='M5' length=$20;
	if Probt&lt;=0.01 then param=strip(put(estimate,6.3))||' ***  ('||strip(put(Estimate/StdErr,6.2))||')';
	else if Probt&lt;=0.05 then param=strip(put(estimate,6.3))||' **  ('||strip(put(Estimate/StdErr,6.2))||')';
	else if Probt&lt;=0.1 then param=strip(put(estimate,6.3))||' *  ('||strip(put(Estimate/StdErr,6.2))||')';
	else param=strip(put(estimate,6.3))||'  ('||strip(put(Estimate/StdErr,6.2))||')';
run;
data MN_6;
	rename Variable=Parameter;
	length Variable  $15;
	set MN_6;	
	attrib param label='M6' length=$20;
	if Probt&lt;=0.01 then param=strip(put(estimate,6.3))||' ***  ('||strip(put(Estimate/StdErr,6.2))||')';
	else if Probt&lt;=0.05 then param=strip(put(estimate,6.3))||' **  ('||strip(put(Estimate/StdErr,6.2))||')';
	else if Probt&lt;=0.1 then param=strip(put(estimate,6.3))||' *  ('||strip(put(Estimate/StdErr,6.2))||')';
	else param=strip(put(estimate,6.3))||'  ('||strip(put(Estimate/StdErr,6.2))||')';
run;
</code></pre>
<pre><code>PROC SQL;
CREATE TABLE CUI.T1_ADJ510 AS
SELECT coalesce(A.Parameter,B.Parameter,C.Parameter,D.Parameter,E.Parameter,F.Parameter) as Parameter,
A.param AS MN_1,B.param AS MN_2,C.param AS MN_3,D.param AS MN_4,E.param AS MN_5,F.param AS MN_6
FROM MN_1 AS A 
FULL JOIN MN_2 AS B
ON A.Parameter=B.Parameter
FULL JOIN MN_3 AS C
ON A.Parameter=C.Parameter OR B.Parameter=C.Parameter
FULL JOIN MN_4 AS D
ON A.Parameter=D.Parameter OR B.Parameter=D.Parameter OR C.Parameter=D.Parameter
FULL JOIN MN_5 AS E
ON A.Parameter=E.Parameter OR B.Parameter=E.Parameter OR C.Parameter=E.Parameter OR D.Parameter=E.Parameter
FULL JOIN MN_6 AS F
ON A.Parameter=F.Parameter OR B.Parameter=F.Parameter OR C.Parameter=F.Parameter OR D.Parameter=F.Parameter OR E.Parameter=F.Parameter
;
QUIT;
</code></pre>
<pre><code>PROC EXPORT DATA= CUI.T1_ADJ510
            OUTFILE= "D:\_云同步\_论文\20171215税收对收入流动性\T1_家庭税收总额作为核心自变量.csv" 
            DBMS=CSV REPLACE;
     PUTNAMES=YES;
RUN;
</code></pre>
<pre><code>#也可以封装为宏块结构：
/*6 个*/
%MACRO Merge_6(OUT=T19 , A=,B=,C=,D=,E=,F=);
PROC SQL;
CREATE TABLE &amp;OUT AS
SELECT coalesce(A.Parameter,B.Parameter,C.Parameter,D.Parameter,E.Parameter,F.Parameter) as Parameter,
A.param AS &amp;A,B.param AS &amp;B,C.param AS &amp;C,D.param AS &amp;D,
E.param AS &amp;E,F.param AS &amp;F
FROM &amp;A AS A 
FULL JOIN &amp;B AS B
ON A.Parameter=B.Parameter
FULL JOIN &amp;C AS C
ON A.Parameter=C.Parameter OR B.Parameter=C.Parameter
FULL JOIN &amp;D AS D
ON A.Parameter=D.Parameter OR B.Parameter=D.Parameter OR C.Parameter=D.Parameter
FULL JOIN &amp;E AS E
ON A.Parameter=E.Parameter OR B.Parameter=E.Parameter OR C.Parameter=E.Parameter OR D.Parameter=E.Parameter
FULL JOIN &amp;F AS F
ON A.Parameter=F.Parameter OR B.Parameter=F.Parameter OR C.Parameter=F.Parameter OR D.Parameter=F.Parameter OR E.Parameter=F.Parameter
;
quit;
</code></pre>
<pre><code>PROC EXPORT DATA= &amp;OUT
            OUTFILE= "D:\_云同步\_论文\20171215税收对收入流动性\&amp;OUT..csv" 
            DBMS=CSV REPLACE;
     PUTNAMES=YES;
RUN;
%MEND;
</code></pre>
]]></description><link>https://actuarygarden.com/topic/22/sas结果仿stata输出-内生性问题</link><guid isPermaLink="true">https://actuarygarden.com/topic/22/sas结果仿stata输出-内生性问题</guid><dc:creator><![CDATA[谢远涛]]></dc:creator><pubDate>Mon, 25 May 2020 01:21:51 GMT</pubDate></item><item><title><![CDATA[SAS IML交互式数据处理及小实例]]></title><description><![CDATA[<pre><code>/*3 交互式矩阵语言 IML*/
/*3.1  概述*/
Proc IML;
	Sc=15.25;
	Vh={1 2};
	Print Sc;
	Print Vh;
Quit;
</code></pre>
<pre><code>/*3.2  数据集操作语句*/
Proc IML;
filename out 'user.matrix'; 
file out; 
    do i=1 to nrow(x); 
       do j=1 to ncol(x); 
          put (x[i,j]) 1.0 +2 @; 
       end; 
     	put;
	end; 
   closefile out;
QUIT;
</code></pre>
<pre><code>/*3.3  循环语句*/
/*3.4  分支语句*/
/*3.5  CALL语句*/
/*3.5  实例*/

/*实例1：方程组求解*/

PROC IML;
		A={2 3 1, 4 -1 2, 3 -1 1};
		b={10, 13,8};
		X=INV(A)*b;
		PRINT A b X;
QUIT;
</code></pre>
<pre><code>/*	实例2：非线性方程的迭代求解*/
PROC IML;
  	maxiter=50; /* 定义最大迭代次数 */ 
    converge=.000001; /* 定义收敛精度*/ 
       /* 定义待求解函数 */ 
start fun; 
      f= x**3-x+2; 
   finish fun; 
       /* 定义导函数 */ 
   start deriv; 
      df=3*x**2-1; 
   finish deriv; 
start newton; 
      run fun;          
      do iter=1 to maxiter  /* 迭代直到最大迭代次数 */ 
      while(max(abs(f))&gt;converge);            /* 收敛则提前退出 */ 
         run deriv;                /* 计算导函数 */ 
         delta=f/df;      /* 计算增量 */ 
         x=x-delta;                    /* 更新值 */ 
         run fun;                      /* 计算函数值 */ 
     end; 
   finish newton; 
do; 
      print "Solving the equation:" ,; 
      x=-1;     /* 赋初值 */ 
      run newton; 
	  iter=iter-1;
	  print x f iter; 
	  if iter&gt;maxiter then print 'Not converge!';
   end;
QUIT;
</code></pre>
<pre><code>/*实例3:把环比指数转化为定基指数*/
data a;
input id index;
cards;
1 100
1 93
1 103
1 97
2 100
2 97
2 116
2 98
run;
proc iml;
use a;
read all into mat;
index=j(8,1,1);
index[1]=mat[1,2];
do i=2 to 8 by 1;
   if (mat[i,1]=mat[i-1,1]) then index[i]=index[i-1]*mat[i,2];
   else index[i]=mat[i,2]; 
end;
 print index;
create b from index;
append from index;
close b;
run;
</code></pre>
]]></description><link>https://actuarygarden.com/topic/21/sas-iml交互式数据处理及小实例</link><guid isPermaLink="true">https://actuarygarden.com/topic/21/sas-iml交互式数据处理及小实例</guid><dc:creator><![CDATA[谢远涛]]></dc:creator><pubDate>Mon, 25 May 2020 01:08:09 GMT</pubDate></item><item><title><![CDATA[SAS ODS输出导出系统]]></title><description><![CDATA[<pre><code>/*4 ODS输出传递系统*/
/*4.1  RTF输出*/
ods rtf ;
proc means data=xie.student;
var math phys chem literat history english;
run;
ods rtf close;
</code></pre>
<pre><code>/*4.2  HTML输出*/
ods html  body= 'odshtml_body.htm' ;
ods html  file= 'odshtml_body.htm' 
contents='odshtml_contents.htm'
page='odshtml_page.htm'
frame='odshtml_frame.htm';
proc univariate data=xie.student;
var math phys chem literat history english;
title;
run;
ods html close;


Ods html body='E:\SAS培训\bclass.html';
Proc print data=xie.class label;
Var  sex age height;
Run;
Ods html close;
</code></pre>
<pre><code>/*4.3  PDF输出*/
Ods pdf file='E:\SAS培训\bclass.pdf';
Proc print data=xie.class label;
Var  sex age height;
Run;
Ods pdf close;
</code></pre>
<pre><code>/*4.4  数据文件输出*/
proc univariate data=xie.student;
var math phys chem literat history english;
ods output 	Moments=Moments;
run;
</code></pre>
<pre><code>/*4.5  图形输出*/


data Sheets;
input Distance @@;
label Distance='Hole Distance in cm';
datalines;
    9.80 10.20 10.27  9.70  9.76
   10.11 10.24 10.20 10.24  9.63
    9.99  9.78 10.10 10.21 10.00
    9.96  9.79 10.08  9.79 10.06
   10.10  9.95  9.84 10.11  9.93
   10.56 10.47  9.42 10.44 10.16
   10.11 10.36  9.94  9.77  9.36
    9.89  9.62 10.05  9.72  9.82
    9.99 10.16 10.58 10.70  9.54
   10.31 10.07 10.33  9.98 10.15
;
run;
title 'Normal Probability-Probability Plot for Hole Distance';
ods graphics on;
proc univariate data=Sheets noprint;
ppplot Distance / normal(mu=10 sigma=0.3)
                        square;
run;


data Plates;
label Gap = 'Plate Gap in cm';
input Gap @@;
datalines;
   0.746  0.357  0.376  0.327  0.485 1.741  0.241  0.777  0.768  0.409
   0.252  0.512  0.534  1.656  0.742 0.378  0.714  1.121  0.597  0.231
   0.541  0.805  0.682  0.418  0.506 0.501  0.247  0.922  0.880  0.344
   0.519  1.302  0.275  0.601  0.388 0.450  0.845  0.319  0.486  0.529
   1.547  0.690  0.676  0.314  0.736 0.643  0.483  0.352  0.636  1.080
   ;
run;
title 'Distribution of Plate Gaps';
ods select ParameterEstimates GoodnessOfFit FitQuantiles MyHist;
proc univariate data=Plates;
var Gap;
histogram / midpoints=0.2 to 1.8 by 0.2
                  lognormal
                  weibull
                  gamma
                  vaxis   = axis1
                  name    = 'MyHist';
inset n mean(5.3) std='Std Dev'(5.3) skewness(5.3)
             / pos = ne  header = 'Summary Statistics';
axis1 label=(a=90 r=0);
run;
</code></pre>
]]></description><link>https://actuarygarden.com/topic/20/sas-ods输出导出系统</link><guid isPermaLink="true">https://actuarygarden.com/topic/20/sas-ods输出导出系统</guid><dc:creator><![CDATA[谢远涛]]></dc:creator><pubDate>Mon, 25 May 2020 01:05:53 GMT</pubDate></item><item><title><![CDATA[经济不平等分析：罗伦兹曲线与gini系数]]></title><description><![CDATA[<pre><code>/*罗伦兹曲线与gini系数*/
data taxf;
	infile 'B:\SAS培训\taxf.txt';
	input TIncome TTax RCode;
	label TIncome='总收入';
	label TTax='总纳税额';
	label RCode='注册类型';
run;
data taxf;
	set taxf;
	if tincome =. then delete;
	label rcode="code for register";
run;
proc gchart data=taxf;
	vbar tincome;
	pie rcode;
run;
proc gplot ;
	plot ttax*tincome;
run;
</code></pre>
<pre><code>data a;
	SET taxf;
proc sort;
	by descending tincome;
run;
data a;
	set a;
	retain m 0;/*按照收入由高到底的顺序逐步汇总总收入*/
	retain n 0;
	 m=m+tincome; n=n+ttax;id=_n_;
run;
proc sort data=a;
	BY descending id;
	run;
data b;
	set a;
	retain total_m total_n;
	if _n_=1 then do total_m=m; total_n=n;end;
		percent_i=m/total_m;
		percent_t=n/total_n;
		p=percent_i;
	run;
</code></pre>
<pre><code>proc sort data=b;
	by 	percent_i;
run;
proc gplot data=b;
	symbol  i=join v=none line=1 width=2;/*color是数据线的颜色，i表示是否连接，v表示数据点用不用特殊符号标记，L表示线型，WIDTH表示数据线的厚度*/
	plot (percent_i )* (percent_t p)/overlay;
run;
proc sql;
select sum(percent_t-percent_i)/sum(percent_t)
from b;
quit;
</code></pre>
]]></description><link>https://actuarygarden.com/topic/19/经济不平等分析-罗伦兹曲线与gini系数</link><guid isPermaLink="true">https://actuarygarden.com/topic/19/经济不平等分析-罗伦兹曲线与gini系数</guid><dc:creator><![CDATA[谢远涛]]></dc:creator><pubDate>Mon, 25 May 2020 01:03:50 GMT</pubDate></item><item><title><![CDATA[SAS 宏]]></title><description><![CDATA[<pre><code>/*2 宏Macro*/
/*2.1 宏变量*/
%let name1=name;
%let name2=‘name’;
proc print data=xie.class;
where height=67;
title “&amp;name1 ‘s height is 67.”;
title2 “&amp;name2 ‘s height is 67.”;
run;
</code></pre>
<pre><code>/*2.2  定义宏*/
/*参数宏*/
%macro try(proc,dsn);
proc &amp;proc data=&amp;dsn;
run;
%mend try;
%try(print,xie.class);
</code></pre>
<pre><code>/*无参数宏*/
%macro plot;/*开始定义宏：PLOT*/
proc plot;
plot income*age;
run;
%mend plot; /*结束宏的定义*/
data newdata; /*创建数据集*/
  input  name $ age income;
cards;
xie 26 3200
wang 23 4400
wu 33 3872
zhou 19 5400
meng 22 5580
; 
run;
%plot/*调用宏，绘制收入关于年龄的散点图*/
proc print;run;
data newdata2; /*筛选年龄大于20的记录，建立新数据集*/
set newdata;
if age&gt;20;Run;
%plot/*再次调用宏，绘制收入关于年龄的散点图*/
proc print;
run;
</code></pre>
<pre><code>/*2.3 宏函数*/
/*2.4 宏表达式*/
/*2.5 宏语句*/
/*2.6 案例*/

/* The Following macro function can find the first position of "exception" in "source" string  */
%macro indexc(source, exception,delimiter=%str( ));
/* the leading and tailling blanks will be delete by way of the following statement */
%let exception =%trim(%left(&amp;exception));
%local count word result temp;
%let count=1;
%let temp=0;
%let result=0;
%let word=%qscan(&amp;exception,&amp;count,&amp;delimiter);

%do %while (&amp;word ne);
	%if (%index(&amp;source,&amp;word) ne 0) %then %do;
	%let temp=%index(&amp;source,&amp;word);
	%if (&amp;temp &lt; &amp;result) or (&amp;result = 0) %then %let result=&amp;temp;%end;
	%let count=%eval(&amp;count+1);
	%let word=%qscan(&amp;exception,&amp;count,&amp;delimiter);
%end;
&amp;result
%mend indexc;

%indexc(am, I am a teacher,delimiter=%str( ));
%macro a;
%local z;
%let z=%indexc( xie18 - xie6, 1 2 3 4 5 6 7 8 9 0,delimiter=%str( ));
%put &amp;z;
%mend a;
%a;
</code></pre>
<pre><code>/*案例二*/
/*  comma split  */
%macro split(indata,outdata);
data &amp;outdata ;
	set &amp;indata;
	length str $10;
	str=trim(left(etiology)); 
	%do i=1 %to 2;
		len=length(str); 
		if trim(left(str))='' then	len=0;
sep_xie=index(str,","); 
		if sep_xie=0  then do;
			if &amp;i=1 then do;
				etiology_&amp;i=str+0;
				str='';end;
			else etiology_&amp;i=.;
			end;
if sep_xie=1 then do;
			etiology_&amp;i=.;str=left(substr(str,sep_xie+1)); 
		end;
		if sep_xie&gt;1 then do; 
		   etiology_&amp;i=left(substr(str,1,sep_xie-1))+0;

str=left(substr(str,sep_xie+1)); 
		end;
	%end;
	rename str=etiology_code;
	drop len sep_xie;
run;
%mend split;
%split(xie.study,study);
</code></pre>
]]></description><link>https://actuarygarden.com/topic/18/sas-宏</link><guid isPermaLink="true">https://actuarygarden.com/topic/18/sas-宏</guid><dc:creator><![CDATA[谢远涛]]></dc:creator><pubDate>Mon, 25 May 2020 01:01:43 GMT</pubDate></item><item><title><![CDATA[SAS SQL语句]]></title><description><![CDATA[<pre><code>/*1 SQL查询*/
/*1.1 简介*/
PROC SQL;
CREATE TABLE CLASS AS
SELECT height,weight,name  FROM XIE.CLASS
WHERE SEX="男";
QUIT;
</code></pre>
<pre><code>/*1.2 单表查询*/
PROC SQL;
CREATE TABLE A1 AS
SELECT height,weight,name  
FROM XIE.CLASS
WHERE age&gt;12
GROUP BY sex
ORDER BY height;

SELECT name, height 
FROM XIE.CLASS 
WHERE name='托马斯';
</code></pre>
<pre><code>/*(一)选择列表SELECT*/
/*1、选择所有列 */
SELECT * 
FROM xie.class;
</code></pre>
<pre><code>/*2、选择部分列并指定它们的显示次序 */
SELECT name,height 
FROM xie.class; 
</code></pre>
<pre><code>/*3、更改列标题 */
SELECT name as 姓名, height as 身高
FROM xie.class;
</code></pre>
<pre><code>/*4、删除重复行 */
SELECT ALL SEX,AGE
FROM xie.class;  
SELECT DISTINCT SEX,AGE
FROM xie.class; 
</code></pre>
<pre><code>/*5、选择不同的行 */
SELECT DISTINCT age 
FROM xie.class;

/*
data xie.class_score ;
merge xie.class xie.student;
if name="" then delete;
drop sex age height weight;
run;
*/

proc sql noprint;
select age, sex
into :age, :sex
from xie.class
where name="简";

%put &amp;age &amp;sex;
</code></pre>
<pre><code>/*(二)FROM子句*/
PROC SQL;
SELECT class_score.name,sex 
FROM xie.class,xie.class_score 
WHERE class.name=class_score.name; 


SELECT a.name,sex 
FROM xie.class AS a,xie.class_score AS b
WHERE a.name=b.name; 

SELECT a.name,sex 
FROM xie.class  a,xie.class_score b
WHERE a.name=b.name; 

SELECT a.name,b.math,total.sum 
FROM xie.class  a,xie.class_score b,
(SELECT name,sum(math,phys,chem,literat,history,english) AS sum
FROM xie.class_score ) AS total 
WHERE a.name=b.name=total.name AND total.sum&gt;360;
</code></pre>
<pre><code>/*(三)使用WHERE子句设置查询条件*/
SELECT * 
FROM xie.class 
WHERE age&gt;12; 

SELECT * 
FROM xie.class 
WHERE age between 10 and 30; 

SELECT * 
FROM xie.class 
WHERE age in(12,13,14); 

SELECT * 
FROM xie.class 
WHERE name like "%%斯"; 


SELECT * 
FROM xie.class 
WHERE age not is null; 
</code></pre>
<pre><code>/*(四)查询结果分组GROUP BY、排序ORDER BY*/
SELECT * 
FROM xie.class 
ORDER BY age desc,name ASC ;


SELECT * 
FROM xie.class 
GROUP BY sex ;
</code></pre>
<pre><code>/*(五)函数*/

/*(六)其他语句*/
/*1.CREATE(创建表, 索引, 视图, 同义词, 过程, 函数, 数据库链接)*/
CREATE TABLE a1 AS
SELECT *
FROM xie.class;

/*2.ALTER(改变表, 索引, 视图等)*/
/*在表的后面增加一个字段*/
ALTER TABLE a1 ADD average num;
/*删除一个字段*/
ALTER TABLE a1 drop average;


DROP TABLE a1;

CREATE TABLE a1 AS
SELECT *
FROM xie.class;
DELETE FROM a1;

INSERT INTO A1 VALUES ( 'ZHANG','男',12,66,120);

UPDATE A1 
SET SEX='女'
WHERE NAME='ZHANG';
</code></pre>
<pre><code>
/*1.3 跨表查询*/
CREATE TABLE a2 AS
SELECT a.name,a.sex,b.sum
FROM xie.class a,
(SELECT name,sum(math,phys,chem,literat,history,english) AS sum
FROM xie.class_score ) AS b
WHERE a.name=b.name ;
</code></pre>
<pre><code>/*1.4 嵌套查询*/

/*1.5 案例*/
proc sql;
/*创建表*/
create table student
(Sno char(4)NOT NULL UNIQUE,/*列级完整性约束条件：取值唯一，不许缺失*/
Sname CHAR(20)  UNIQUE,/*列级完整性约束条件：取值唯一*/
Ssex char(1),
Sdept char(3),
Salary num,
Birth num informat=date7.
format=date7.,
Hired num informat=date7.
format=date7.);
/*写入信息*/
   insert into student
 values('1639', '李四', 'F','TA1',42260,'26JUN70'd,'28JAN91'd)
 values('1065', '张立', 'M','ME3',38090,'26JAN54'd,'07JAN92'd)
 values('1400', '李勇', 'M','ME1',29769.'05NOV67'd,'16OCT90'd)
 values('1561' ,'刘晨', 'M',null,36514,'30NOV63'd,'07OCT87'd)
 values('1221', '王敏', 'F','FA3',.,'22SEP63'd,'04OCT94'd ) ;
/*修改*/
alter table student
add  age num;
/*创建查询*/
title 'PROCLIB.PAYLIST Table';
select *
from student;
/*删除表*/
drop table student;
quit;
</code></pre>
]]></description><link>https://actuarygarden.com/topic/17/sas-sql语句</link><guid isPermaLink="true">https://actuarygarden.com/topic/17/sas-sql语句</guid><dc:creator><![CDATA[谢远涛]]></dc:creator><pubDate>Mon, 25 May 2020 00:59:32 GMT</pubDate></item><item><title><![CDATA[SAS关于身份证号码的提取分析]]></title><description><![CDATA[<pre><code>data ex;                                                                                                                                
     input ID $1-20  year 7-10 mon 11-12 day 13-14;                                                                                    
     cards;                                                                                                                  
110103197512092232                                                                                                              
110101196902150059                                                                                                              
;                                                                                                                               
run;  



/*如果身份证前空格，错误原因？*/
data ex;
	input id $1-50 year 7-10 mon 11-12 day 13-14;
	year=substr(id,7,4);
	month=substr(id,11,2);
	day=substr(id,13,2);
	birthday=mdy(month,day,year);
	birthday1=put(mdy(month,day,year),WORDDATE.);
	age=year(today())-year(birthday);
	cards;                                                                                                                  
        110103197512092232                                                                                                              
        110101196902150059                                                                                                              
        ;                                                                                                                               
run;  
proc print data=ex;                                                                                                                     
run;                                                                                                                                    

DATA EX2;
SET EX;
YEAR=SUBSTR(LEFT(RIGHT(ID)),7,4);
RUN;
</code></pre>
]]></description><link>https://actuarygarden.com/topic/14/sas关于身份证号码的提取分析</link><guid isPermaLink="true">https://actuarygarden.com/topic/14/sas关于身份证号码的提取分析</guid><dc:creator><![CDATA[谢远涛]]></dc:creator><pubDate>Mon, 25 May 2020 00:52:39 GMT</pubDate></item></channel></rss>