99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀sas單變量的特征分析
sas單變量的特征分析
2017-03-31
收藏

sas單變量的特征分析

大炮,我有個煩惱,我領(lǐng)導(dǎo)最近老叫我單變量結(jié)合因變量分析,但是都是分段分析,我總是寫proc sql然后group by ,但是這個過程好無聊啊,有木有什么新的代碼,讓我可以分析的快點(diǎn)啊。

最近寫了個宏,剛好可以解決你這個問題,在上代碼之前,先來個結(jié)果圖

詹大炮

這個結(jié)果對于分析來說是不好的,因為這個結(jié)果沒啥實(shí)際意義,說白了就是跟因變量沒關(guān)系,但是這個圖我們不是要來講變量怎么有用,我們要介紹的是這段代碼最后呈現(xiàn)的一個結(jié)果是怎樣的。

代碼:

%macro ChcAnalysis(DSin, DVVar, VarX, NBins, Method, DSChc);

proc sort data=&DSin;

by &VarX;

run;

Data temp;

set &DSin ;

by &VarX;

_Obs=_N_;

keep &DVVAr &VarX _Obs;

run;

proc sql noprint;

%if &Method=1 %then %do;

select count(&DVVar) into :N from temp;

select max(_Obs), min(_Obs) into :Vmax, :Vmin from temp;

%let BinSize=%sysevalf((&Vmax)/&Nbins);

%let LB_1=0;

%do i=1 %to %eval(&Nbins-1);

%let LB_&i=%sysevalf(&LB_1+(&i-1)*&BinSize);

%let UB_&i=%sysevalf(&&LB_&i + &BinSize);

select sum(&DVVar) , count(*) into :Sum_&i , :N_&i from temp

where _obs>=&&Lb_&i and _obs<&&Ub_&i;

%end;

%let LB_&NBins=%sysevalf(&LB_1+(&NBins-1)*&BinSize);

%let UB_&NBins=&Vmax;

select sum(&DVVar) , count(*) into :Sum_&i , :N_&i from temp

where _obs>=LB_&NBins and _obs<=UB_&NBins;

%end;

%else %do ;

select count(&DVVar) into :N from temp;

select max(&VarX), min(&VarX) into :Vmax, :Vmin from temp;

%let BinSize=%sysevalf((&Vmax-&Vmin)/&Nbins);

%let LB_1=&Vmin;

%do i=1 %to %eval(&Nbins-1);

%let LB_&i=%sysevalf(&LB_1+(&i-1)*&BinSize);

%let UB_&i=%sysevalf(&&LB_&i + &BinSize);

select sum(&DVVar) , count(*) into :Sum_&i , :N_&i from temp

where &VarX>=&&Lb_&i and &VarX<&&Ub_&i;

%end;

%let LB_&NBins=%sysevalf(&LB_1+(&NBins-1)*&BinSize);

%let UB_&NBins=&Vmax;

select sum(&DVVar) , count(*) into :Sum_&i , :N_&i from temp

where &VarX>=&&Lb_&i and &VarX<=&&UB_&i;

%end;

quit;

data &DSChc;

%do i=1 %to &NBins;

Bin=&i;

LowerBound=&&LB_&i;

UpperBound=&&UB_&i;

if (&&sum_&i =. ) then N_1=0; else N_1=&&Sum_&i;

if &&N_&i=. then BinTotal=0; else BinTotal=&&N_&i;

N_0 = BinTotal-N_1;

Percent_1=100*N_1/BinTotal;

Percent_0=100*N_0/BinTotal;

output;

%end;

Run;

proc datasets nodetails nolist library=work;

delete temp;

run;

quit;

%mend;

詹大炮

還是老樣子,分段介紹。

01

% ChcAnalysis(DSin, DVVar, VarX, NBins, Method, DSChc);

DSin:填入的是原數(shù)據(jù)集;

DVVar:填入因變量,這里我們分析的是二元的因變量,所以因變量一定要是二元的,并且必須是數(shù)值的0,1。因為在代碼中設(shè)定的就是這樣子的,至于你問我為什么不能是字符,那是因為我還沒能耐寫字符的。

VarX:你要分析的變量(數(shù)值的哈)

NBins:分幾段分析。結(jié)果的例子是分了5段;

Method:怎么分。1-等高度分,2-等寬度分。我的結(jié)果圖那個是按2分的。

DSChc:結(jié)果數(shù)據(jù)集的輸出名字。

02

proc sort data=&DSin;by &VarX;run;

Data temp;

set &DSin ;

by &VarX;

_Obs=_N_;

keep &DVVAr &VarX _Obs;

run;

將原數(shù)據(jù)集中的變量排序,后面的分組的時候要用到。然后保留要分析的變量在temp數(shù)據(jù)集中,產(chǎn)生變量_Obs,作為序號,這是等高度分析的時候要用的。等高度的意思就是每個區(qū)間的數(shù)量是一樣的,等寬度的意思是,區(qū)間的的差值是一樣的。兩個不同的情況,在分析的時候,如果等寬的結(jié)果你覺得不是很明顯可以分析的話,就換等高,任意切換哈。

temp的數(shù)據(jù)集是長這樣子的:

_obs是觀測的序號。

03

proc sql noprint;

%if &Method=1 %then %do;

select count(&DVVar) into :N from temp;

select max(_Obs), min(_Obs) into :Vmax, :Vmin from temp;

%let BinSize=%sysevalf((&Vmax)/&Nbins);

%let LB_1=0;

%do i=1 %to %eval(&Nbins-1);

%let LB_&i=%sysevalf(&LB_1+(&i-1)*&BinSize);

%let UB_&i=%sysevalf(&&LB_&i + &BinSize);

select sum(&DVVar) , count(*) into :Sum_&i , :N_&i from temp

where _obs>=&&Lb_&i and _obs<&&Ub_&i;

%end;

%let LB_&NBins=%sysevalf(&LB_1+(&NBins-1)*&BinSize);

%let UB_&NBins=&Vmax;

select sum(&DVVar) , count(*) into :Sum_&i , :N_&i from temp

where _obs>=LB_&i. and _obs<=UB_&i.;

%end;

%else %do ;

select count(&DVVar) into :N from temp;

select max(&VarX), min(&VarX) into :Vmax, :Vmin from temp;

%let BinSize=%sysevalf((&Vmax-&Vmin)/&Nbins);

%let LB_1=&Vmin;

%do i=1 %to %eval(&Nbins-1);

%let LB_&i=%sysevalf(&LB_1+(&i-1)*&BinSize);

%let UB_&i=%sysevalf(&&LB_&i + &BinSize);

select sum(&DVVar) , count(*) into :Sum_&i , :N_&i from temp

where &VarX>=&&Lb_&i and &VarX<&&Ub_&i;

%end;

%let LB_&NBins=%sysevalf(&LB_1+(&NBins-1)*&BinSize);

%let UB_&NBins=&Vmax;

select sum(&DVVar) , count(*) into :Sum_&i , :N_&i from temp

where &VarX>=&&Lb_&i and &VarX<=&&UB_&i;

%end;

quit;

我知道你肯定要說,這密密麻麻的% &*我不想看。但是你看下嘛,不難的,我介紹介紹給你看嘛。

首先這段代碼需要分成兩步來看,第一步是當(dāng)我們的&Method=1 的情況執(zhí)行do后面的程序,反之,則是當(dāng)我們的&Method=2的時候的情況啦。

然后我們來講&Method=1情況時執(zhí)行的代碼:

select count(&DVVar) into :N from temp;

select max(_Obs), min(_Obs) into :Vmax, :Vmin from temp;

第一個select賦值宏是算出全部的觀測數(shù)。

第二個select是算出最大的那個序號,其實(shí)我個人覺得這步有點(diǎn)多 余,你想直接用n也可以的,只是我想跟&Method=2的思路一樣,所以就沒刪。

%let BinSize=%sysevalf((&Vmax)/&Nbins);

%let LB_1=0;

%do i=1 %to %eval(&Nbins-1);

%let LB_&i=%sysevalf(&LB_1+(&i-1)*&BinSize);

%let UB_&i=%sysevalf(&&LB_&i + &BinSize);

select sum(&DVVar) , count(*) into :Sum_&i , :N_&i from temp

where _obs>=&&Lb_&i and _obs<&&Ub_&i;

%end;

BinSize因為是&Method=1,所以這里BinSize是區(qū)間的差值,這里有個宏函數(shù)%sysevalf就自己百度下用法吧,這里就不介紹了。%do i=1 %to %eval(&Nbins-1);這一步就開始循環(huán),這里為什么只循環(huán)到倒數(shù)第二個呢,是因為倒數(shù)第一個直接就是剩下的全部,就不需要再區(qū)間限制了。

%let LB_&i=%sysevalf(&LB_1+(&i-1)*&BinSize);

%let UB_&i=%sysevalf(&&LB_&i + &BinSize);

這兩步是產(chǎn)生這個分組的上下區(qū)間,然后用于后面的select語句中的where條件,把該區(qū)間的數(shù)量統(tǒng)計出來。

select sum(&DVVar) , count(*) into :Sum_&i , :N_&i from temp

where _obs>=&&Lb_&i and _obs<&&Ub_&i;

%end;

這個過程特別注意的就是sum(&DVVar),是用sum,這就是我一開始為什么說因變量是二元的,而且要是0,1的情況就是方便這里統(tǒng)計啦。

%let LB_&NBins=%sysevalf(&LB_1+(&NBins-1)*&BinSize);

%let UB_&NBins=&Vmax;

select sum(&DVVar) , count(*) into :Sum_&i , :N_&i from temp

where _obs>=LB_&i. and _obs<=UB_&i.;

%end;

這就是第四步啦,

%let LB_&NBins=%sysevalf(&LB_1+(&NBins-1)*&BinSize);

%let UB_&NBins=&Vmax;

產(chǎn)生最后的區(qū)間,這里的i是5了,其實(shí)我一直很不能理解到這步,為什么還可以輸出i=5呢,不是i只循環(huán)到4嗎?但是執(zhí)行的時候就是這樣子的,這個套路是仿照之前的等高度分變量區(qū)間的那個代碼寫的。

我還特地看了日志也循環(huán)了:

我覺得應(yīng)該是sas的處理流程,在pdv層面應(yīng)該可以解釋,跪求大神在留言區(qū)解釋。萬分感激。

那么&Method=2的部分就留給你自己去看啦,還是&Method=1的那種套路,只是等區(qū)間變量等量而已。

04

data &DSChc;

%do i=1 %to &NBins;

Bin=&i;

LowerBound=&&LB_&i;

UpperBound=&&UB_&i;

if (&&sum_&i =. ) then N_1=0; else N_1=&&Sum_&i;

if &&N_&i=. then BinTotal=0; else BinTotal=&&N_&i;

N_0 = BinTotal-N_1;

Percent_1=100*N_1/BinTotal;

Percent_0=100*N_0/BinTotal;

output;

%end;

Run;

然后這部分就是以上產(chǎn)生的宏,拼接成結(jié)果數(shù)據(jù)集。這里應(yīng)該注意的是,每循環(huán)一個,就是產(chǎn)生一條觀測之后output到數(shù)據(jù)集,如此循環(huán)之后需知道i=&nbins為止。數(shù)據(jù)分析師培訓(xùn)


數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時表示是新驗證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }