【问题标题】:SAS Compare every variable with every other variable in a specific calculationSAS 在特定计算中将每个变量与其他所有变量进行比较
【发布时间】:2017-12-01 15:32:08
【问题描述】:

我面临的问题是我有 262 只股票的样本。现在我必须对这些股票配对的每种可能组合进行计算。 我正在考虑采取两个循环。但是按照我的编码方式,我什至没有在日志窗口中得到任何输出或错误通知。 首先,我使用 proc sql 将所有股票代码放入一个宏变量中。

proc sql noprint;
select distinct name
into :ticker separated by " "
from stocks;
quit;



%macro close2;
%let n=262; /*262 stocks*/

%do i=1 %to &n.-1;
%do j=i-1 %to &n.;

%let s1=%trim(%scan(&ticker.,&i.," "));
%let s2=%trim(%scan(&ticker.,&j.," "));


data close;
set normp;
closeness=(&s1.-&s2.)**2;
run;

proc means data=close noprint; 
var closeness;
output out=close1 (drop=_type_ _freq_)
sum(closeness)=closen;
run;quit;

data=close1;
set close1;
&s1.%s2.=closen;
run;

%end;
%end;
%mend close2;

最后,我希望用我计算出来的两只股票的两个股票代码来命名 var "closeness" 的所有不同总和。

【问题讨论】:

  • 你有 PROC IML 吗?
  • 一个数据集中有262个变量,有多少行?
  • 这个计算我需要 250 行
  • 是的,我想我有 proc iml

标签: loops macros sas


【解决方案1】:

别傻了 (http://www2.sas.com/proceedings/forum2007/183-2007.pdf)

我假设您有用于比较的日期列或其他标识符。

一些假数据:

%let nStocks=200;

data stocks;
array S[&nStocks];
do date=1 to 10;
    do st=1 to &nStocks;
        S[st] = rannor(1);
    end;
    output;
end;
drop st;
run;

将其转置为“又长又瘦”而不是“又短又宽”

proc transpose data=stocks out=stocks_t(rename=(_name_=Stock1 col1=S1_value));
by date;
run;

一种确保所有内容都是相同顺序的排序(稍后会很重要)和一个用于获取股票名称的 PROC SQL 步骤。

proc sort data=stocks_t;
by date Stock1;
run;

proc sql noprint;
select distinct Stock1
    into :stocks separated by ' '
    from stocks_t
    order by Stock1;
quit;

%put &stocks;

现在使用数据步骤来查看数据。使用哈希表和循环为每个日期添加不同的组合。计算“接近度”。

data need;
set stocks_t;
if _n_=1 then do;
    %create_hash(lk,date Stock2, S2_Value,"stocks_t(rename=(Stock1=Stock2 S1_Value=S2_value))");
end;
by date;

stocks = "&stocks";

if first.date then
    count = 1;

count + 1;

do j=count to &nStocks;
    Stock2 = scan(stocks,j);
    S2_value = .;
    rc = lk.find();
    closeness=(S1_Value-S2_Value)**2;
    C_Var = catt(Stock1,Stock2);
    output;
end;

drop rc count stocks j;
run;

从这里开始,你只需要做你的总和就可以了:

proc summary data=need;
var closeness;
class C_Var;
output out=closeness(where=(C_Var^="") drop=_type_ _freq_) sum=;
run;

%create_hash() 来自此处的宏:https://github.com/FinancialRiskGroup/SASPerformanceAnalytics

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 2021-01-02
    • 2022-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多