Good morning my SAS friends:
Here is a question about SAS basic computing
As we know, confidence interval (CLASS) is a usual statistical procedure where we group many observations in CLASSES considering the upper and lower limits and the number of observations (n) as grouping criteria (see this example http://www.vitutor.com/statistics/descriptive/frequency_distribution.html)
Considering these data:
3, 15, 24, 28, 33, 35, 38, 42, 43, 38, 36, 34, 29, 25, 17, 7, 34, 36, 39, 44, 31, 26, 20, 11, 13, 22, 27, 47, 39, 37, 34, 32, 35, 28, 38, 41, 48, 15, 32, 13.
In this case, 48 − 3 = 45. For the purpose of this table, increase the number to 50. Therefore, 50 : 5 = 10 intervals.
xi fi Fi ni Ni
[0, 5) 2.5 1 1 0.025 0.025
[5, 10) 7.5 1 2 0.025 0.050
[10, 15) 12.5 3 5 0.075 0.125
[15, 20) 17.5 3 8 0.075 0.200
[20, 25) 22.5 3 11 0.075 0.275
[25, 30) 27.5 6 17 0.150 0.425
[30, 35) 32.5 7 24 0.175 0.600
[35, 40) 37.5 10 34 0.250 0.850
[40, 45) 42.5 4 38 0.100 0.950
[45, 50) 47.5 2 40 0.050 1
40 1
Is there any SAS Statement that could help???
thanks in advance
These are NOT confidence intervals.
You want to apply a format that groups your data into the intervals shown, and then run PROC FREQ on this data.
Something like this (where you do the rest of the typing on line 2)
proc format; value xf 0-4.99='0-5' 5-9.99='5-10' ... ; run; proc freq; table x; format xf.; run;
Where's the data = in proc freq? Check proc before as well for no errors.
@jonatan_velarde wrote:
proc freq;
110 table x;
111 format xf.;
___
22
76
ERROR 22-322: Syntax error, expecting one of the following: a name, _ALL_, _CHARACTER_, _CHAR_, _NUMERIC_.
ERROR 76-322: Syntax error, statement will be ignored.
Simple omission on my part. The command should be
format x xf.;
WPS/SAS/R Class (confidence) intervals
IML has an interface to R
IML might have this function, I am not sure.
I think you want left close ']' otherwise tou could miss and observation
https://communities.sas.com/t5/General-SAS-Programming/Class-confidence-intervals/m-p/347383
HAVE
====
Up to 40 obs SD1.HAVE total obs=50
Obs NUMS
1 3
2 15
3 24
4 28
5 33
6 35
7 38
8 42
9 43
...
46 42
47 43
48 14
49 30
50 10
WANT
====
Up to 40 obs from c2wps total obs=10
Obs C1 FREQ
1 (0,5] 1
2 (5,10] 2
3 (10,15] 7
4 (15,20] 2
5 (20,25] 4
6 (25,30] 6
7 (30,35] 11
8 (35,40] 8
9 (40,45] 6
10 (45,50] 3
The MEANS Procedure
Analysis Variable : NUMS
N Lower 95% Upper 95%
C1 Obs Mean Std Dev CL for Mean CL for Mean
------------------------------------------------------------------------------
(0,5] 1 3.0000000 . . .
(5,10] 2 8.5000000 2.1213203 -10.5593071 27.5593071
(10,15] 7 13.5714286 1.3972763 12.2791636 14.8636936
(15,20] 2 18.5000000 2.1213203 -0.5593071 37.5593071
(20,25] 4 23.2500000 1.5000000 20.8631653 25.6368347
(25,30] 6 28.0000000 1.4142136 26.5158739 29.4841261
(30,35] 11 33.2727273 1.5550504 32.2280302 34.3174244
(35,40] 8 37.6250000 1.1877349 36.6320287 38.6179713
(40,45] 6 42.5000000 1.0488088 41.3993426 43.6006574
(45,50] 3 47.6666667 0.5773503 46.2324491 49.1008842
------------------------------------------------------------------------------
WORKING CODE
R
c1 <- cut(have$NUMS, breaks = seq(0, 50, by = 5));
proc means
* _ _ _
_ __ ___ __ _| | _____ __| | __ _| |_ __ _
| '_ ` _ \ / _` | |/ / _ \_____ / _` |/ _` | __/ _` |
| | | | | | (_| | < __/_____| (_| | (_| | || (_| |
|_| |_| |_|\__,_|_|\_\___| \__,_|\__,_|\__\__,_|
;
options validvarname=upcase;
libname sd1 "d:/sd1";
data sd1.have;
input nums @@;
cards4;
3 15 24 28 33 35 38 42 43 38 36 34 29 25 17 7 34 36 39 44 31
26 20 11 13 22 27 47 39 37 34 32 35 28 38 41 48 15 32 13
14 22 35 48 31 42 43 14 30 10
;;;;
run;quit;
*____ _ _ _
| _ \ ___ ___ | |_ _| |_(_) ___ _ __
| |_) |____/ __|/ _ \| | | | | __| |/ _ \| '_ \
| _ <_____\__ \ (_) | | |_| | |_| | (_) | | | |
|_| \_\ |___/\___/|_|\__,_|\__|_|\___/|_| |_|
;
%utl_submit_wps64('
libname sd1 "d:/sd1";
options set=R_HOME "C:/Program Files/R/R-3.3.2";
libname wrk "%sysfunc(pathname(work))";
proc r;
submit;
library(haven);
have<-read_sas("d:/sd1/have.sas7bdat");
c1 <- cut(have$NUMS, breaks = seq(0, 50, by = 5));
c1;
c2<-as.data.frame(table(c1));
endsubmit;
import r=c2 data=wrk.c2wps;
import r=c1 data=wrk.c1wps;
run;quit;
');
data cutval;
merge c1wps sd1.have;
run;quit;
/*
Up to 40 obs WORK.CUTVAL total obs=50
Obs C1 NUMS
1 (0,5] 3
2 (10,15] 15
3 (20,25] 24
4 (25,30] 28
5 (30,35] 33
6 (30,35] 35
7 (35,40] 38
8 (40,45] 42
*/
proc means data=cutval mean std clm;
class c1;
var nums;
run;quit;
NOTE: Using R version 3.3.2 (2016-10-31) from C:/Program Files/R/R-3.3.2
NOTE: Submitting statements to R:
> library(haven);
> have<-read_sas("d:/sd1/have.sas7bdat");
> c1 <- cut(have$NUMS, breaks = seq(0, 50, by = 5));
> c1;
> c2<-as.data.frame(table(c1));
NOTE: Processing of R statements complete
12 import r=c2 data=wrk.c2wps;
NOTE: Creating data set 'WRK.c2wps' from R data frame 'c2'
NOTE: Column names modified during import of 'c2'
NOTE: Data set "WRK.c2wps" has 10 observation(s) and 2 variable(s)
13 import r=c1 data=wrk.c1wps;
NOTE: Creating data set 'WRK.c1wps' from R data frame 'c1'
NOTE: Column names modified during import of 'c1'
NOTE: Data set "WRK.c1wps" has 50 observation(s) and 1 variable(s)
14 run;
NOTE: Procedure r step took :
real time : 0.655
cpu time : 0.015
15 quit;
NOTE: Submitted statements took :
real time : 0.702
cpu time : 0.046
Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!
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.