OK. But you need to transpose your data from wide to long.
data _temp;
do i=1 to 20;
x1=sin(i/10);
x2=cos(i/20);
x3=sin(i/100)-cos(i/30);
x4=sin(i/50)+cos(i/200);
wt_x1=10;
wt_x2=25;
wt_x3=30;
wt_x4=35;
output;
end;
run;
** transpose ;
data t2;
set _temp;
array xs {*} x1-x4;
array ws {*} wt_x1-wt_x4;
do j=1 to dim(xs);
x1=xs[j];
wt_x1=ws[j];
output;
end;
keep i x1 wt_x1;
run;
proc sql;
create table temp as
select *,mean(x1) as mean_x1,sum(x1*wt_x1)/sum(wt_x1) as wt_mean_x1
from t2 as a
group by i;
/*select sqrt( sum(wt_x1*(x1-wt_mean_x1)**2) / sum(wt_x1*( (n-1)/n )) ) as wt_std*/
select i as row_id,sqrt( sum(wt_x1*(x1-wt_mean_x1)**2) / sum(wt_x1) ) as wt_std
from temp
group by i;
quit;
*Check the result is consisted with PROC MEANS or not;
proc means data=t2 mean stddev VARDEF=WEIGHT;
by i;
var x1;
weight wt_x1;
run;
Thanks @Ksharp - I had never seen the VARDEF= option. I think, though, that @hellohere is trying to get the weighted SD for each row. In any case, I am still baffled by how the other PROC MEANS / SUMMARY outputs (further up) are producing such a large SD (>5). Seems nonsensical.
Thanks @Ksharp - good to know. I saw posts complaining about this issue as far back as 2008. Seems really dumb that this is not the default, because I have yet to see a single version of the equation for weighted SD that involves using a simple N-1 denominator. That said, perhaps the effect is magnified when the N is very small (only 4 in this case), and I honestly can't imagine why anyone would want the SD of 4 numbers.
If ever there was an argument for not writing your own code to do this type of calculation, this thread is it.
April 27 – 30 | Gaylord Texan | Grapevine, Texas
Walk in ready to learn. Walk out ready to deliver. This is the data and AI conference you can't afford to miss.
Register now and lock in 2025 pricing—just $495!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.