SAS:从零开始用proc report出人口统计学表

news2024/11/18 17:31:20

目的:如何生成如下图所示的人口统计学的表格
在这里插入图片描述

要点:
1、连续型变量(基线体重、基线身高等)需要展示例数、均值、中位值、最小值、最大值;离散型变量(性别、民族等)需要展示例数和百分比。这些统计量如何计算?
2、统计量需要保留几位小数?
3、如何令前3个剂量组、后5个剂量组分别属于共同的列名SC(肌肉注射)和IV(静脉滴注)?
4、如何在不同变量之间添加空行(如体重和性别之间用空行分割)?

步骤:
1、整合数据集,得到需要的变量:各受试者的组别、体重、性别;

/*1-rawdata*/
data dm1;
	merge dm rand wt(where=(visit='D-1'));
	by subjid;
	keep subjid sex weight grpn;
run;
/*2-generate total column*/
data dm2;
	set dm1;
	ouput;
	grpn=9;
	output;
run;
/*3-counts number of every group*/
proc sql noprint;
	select count(*) into:n1-:n9 
	group by grpn;
quit;
/*4-builds relation between grpn and &nx.*/
proc format;
	value total;
	1 = &n1.
	2 = &n2.
	3 = &n3.
	4 = &n4.
	5 = &n5.
	6 = &n6.
	7 = &n7.
	8 = &n8.
	9 = &n9.;
run;
data dm3;
	set dm2;
	var1='weight';/*the purpose for merging statistics with maxlen*/
	total=input(put(grpn,&total.),best.);
	if find(weight,'.') then len1=length(scan(weight,2,'.'));
	else len1=0;
/*5-generates different output format according to types of statistics:maxumum decimal places 4*/
proc sql noprint;
	create table maxlen1 as
	select "weight" as var1, max(len1) as maxl,
		   /*for medium, mean*/
		   case when (calculated maxl le 3) then
		   			 strip(put(8 + 0.1*(calculated maxl + 1),best.))
		        else strip(put(8 + 0.1*4,best.)) as maxl1,
		   /*for std*/
		   case when (calculated maxl le 2) then
		   			 strip(put(8 + 0.1*(calculated maxl + 2),best.))
		        else strip(put(8 + 0.1*4,best.)) as maxl2,
		  /*for n, min, max*/
		  strip(put(8 + 0.1*(calculated maxl),best.)) as maxl0
quit;

2、衍生变量:对连续型和离散型变量分别应用不同的proc步得到相应的统计量;

/*1-for continuous variables*/
proc sort data=dm3;
	by var1, grpn;
run;
proc summary data=dm3;
	by var1, grpn;
	var weight;
	output out=weight/n = _n mean = _mean median = _median min = _min max = _max;
run;
/*for discrete variables*/
proc freq data=dm3;
	by grpn;
	tables sex/out=sex;
run;

3、美化数据集:用cat和put/putn函数将Mock中需要的统计量展示方式进行组合;生成排序变量,保证最终的变量按照Mock中想要的顺序展示;

/*1-for continuous variables*/
data weight1;
	merge weight maxlen1;
	by var1;
	/*combine statistics according to _n*/
	n = strip(put(_n, best.));
	if _n >1 then do;
		msd = cat(strip(putn(_mean,maxl1)), ' (',
			      strip(putn(_std,maxl2)), ')');
	    med = cat(strip(putn(_median,maxl1)),' (',
	    		  strip(putn(_min,maxl0)), ', ',
	    		  strip(putn(_max,maxl0)),')');end;
	else do;
		msd = strip(putn(_mean,maxl1));
		med = strip(putn(_median,maxl1));end;
run;
proc transpose data=weight1 out=weight2 prefix=group;
	id grpn;
	var n msd med;
run;
data weight3;
	set weight2;
	variable = '体重(kg)';
	if _name_ = 'N' then stat = 'n';
	else if _name_ = 'MSD' then stat = '均值(标准差)';
	else if _name_ = 'MED' then stat = '中位值(最小值,最大值)';
run;
/*2-for discrete variables*/
proc sql noprint;
	create table sex1 as
	select '性别' as variable format = $100., grpn, sex as stat,
			cat(strip(put(count,best.)), ' (',
			strip(put(round(count/total*100,0.1),8.1.)), '%') as pct length = 100	
	from sex
	order by variable, stat, grpn;
quit;
/*3-set datasets*/
data z;
 	retain ord variable stat group1-group9 blk;
	set weight3 sex1;
	blk='';/*for breaking SC and IV*/
	if variable='体重(kg)' then ord = 1;
	else ord = 2;
	keep ord variable stat group1-group9 blk;

4、用proc report将美化后的数据集输出成rtf格式。

/*1-initialize rtf settings*/
options validvarname = upcase nodate nonumber nomprint orientation = landscape papersize = letter;
options topmargin = 2.54cm bottommargin = 2.54cm leftmargin = 2.54cm rightmargin = 2.54cm;
title;
ods escapechar="@";
ods listing close;
ods rtf file="C:\cdisc\tfl\dm.rtf" style=tab;
/*2-generate title*/
%let title=%str(1 受试者人口学特征描述性统计结果);
ods rtf text="@R/RTF'\ql\fs21\outlinelevel1\b\pnhang\fi-1200\li1200' &title.";
/*3-genarate complete table*/
proc report data = z 
	style(report) = {frame = hsides rules = groups cellpadding = 0 outputwidth = 100%}
	style(header) = {backgroundcolor = white fontweight = medium};
	column ord variable stat ("@R'\brdrb\brdrs' SC" group1-group3) blk ("@R'\brdrb\brdrs' IV" group4-group8) group9;
	define ord/order order=interval noprint;
	define variable/order order=data style(column)={just=left cellwidth=7%} style(header)={just=left} "变量";
	define stat    /order order=data style(column)={just=center cellwidth=12%} style(header)={just=center} "统计量";
	define group1/style(column)={just=center cellwidth=8%} style(header)={just=center} "3 mg";
	define group2/style(column)={just=center cellwidth=8%} style(header)={just=center} "10 mg";
	define group3/style(column)={just=center cellwidth=8%} style(header)={just=center} "20 mg";
	define blk   /style(column)={cellwidth=0.5%} style(header)={cellwidth=0.5%} ""
	define group4/style(column)={just=center cellwidth=8%} style(header)={just=center} "30 mg";
	define group5/style(column)={just=center cellwidth=8%} style(header)={just=center} "40 mg";
	define group6/style(column)={just=center cellwidth=8%} style(header)={just=center} "50 mg";
	define group7/style(column)={just=center cellwidth=8%} style(header)={just=center} "60 mg";
	define group8/style(column)={just=center cellwidth=8%} style(header)={just=center} "100 mg";
	define group9/style(column)={just=center cellwidth=8%} style(header)={just=center} "合计";
	
	compute after variable;
		varlen = ifn(ord=1,100,0);
		line blk $varying. varlen;
	endcomp;
run;

ods listing;
ods rtf colse;

拓展:
1、putn、putc、put、inputn、inputc、input的区别。

函数定义
putcenables you to specify a character format at run time
putnenables you to specify a numeric format at run time
putreturns a value using a specified format
inputcenables you to specify a character informat at run time
inputnenables you to specify a numeric informat at run time
inputreturns the value that is produced when SAS converts an expression by using the specified informat

从SAS Help中可以看到inputc函数和input函数进行对比,input函数在编译阶段就执行,而inputc函数在运行阶段执行,所以input函数比inputc函数更快执行(其实适用于input/put函数和与之对应的表格中的四个函数中,因为在这四个函数的定义中都可以看到他们都是在运行阶段执行的)在这里插入图片描述
因此,put函数在编译阶段就需要指定一个format,而putc或putn函数在运行阶段才要format。那么,这个format可以是运行阶段生成的变量。如果用于宏函数,就只能用putn或putc。
下面是SAS Help中的例子。

/*putn*/
proc format;
	value writfmt 1 = 'date9.'
				  2 = 'mmddyy10.';
run;

data dates;
	input number key;
	datefmt = put(key,writfmt.);
	date = putn(number,datefmt);
	datalines;
	15756 1
	14552 2
	;
run;

在这里插入图片描述

/*putc*/
proc format;
	value typefmt 1='$groupx'
				  2='$groupy';
	value $groupx 'positive'='agree'
		  		  'negtive' ='disagree';
	value $groupy 'positive'='pass'
		  		  'negtive' ='fail';
run;

data answers;
	length word $ 8;
	input type response $;
	respfmt=put(type,typefmt.);
	word=putc(response,respfmt);
	datalines;
	1 positive
	1 negtive
	2 negtive
	2 positive
	;
run;

在这里插入图片描述

/*inputn*/
proc format;
	value readfmt 1 = 'date9.'
				  2 = 'mmddyy10.';
run;

data dates;
	input number key;
	datefmt = put(key,readfmt .);
	date = inputn(number,datefmt);
	datalines;
	15756 1
	14552 2
	;
run;
/*inputc*/
proc format;
	value typefmt 1='$groupx'
				  2='$groupy';
	invalue $groupx 'positive'='agree'
		  		    'negtive' ='disagree';
    invalue $groupy 'positive'='pass'
		  		    'negtive' ='fail';
run;

data answers;
	length word $ 8;
	input type response $;
	respfmt=put(type,typefmt.);
	word=inputc(response,respfmt);
	datalines;
	1 positive
	1 negtive
	2 negtive
	2 positive
	;
run;

在这里插入图片描述

2、$varying格式及在proc report中插入新行的应用
在这里插入图片描述

/*adds new line afer every groups*/
define var /order|group;
compute after var;
	line "";
endcomp;

/*adds new line after specified groups*/
define var /order|group;
compute after var;
	blk="";
	if var in("1","3") then varlen=100;
	else varlen=0;
	line blk $varying. varlen;
endcomp;

3、RTF中常用的格式设置


\ql 左对齐(默认)
\fsN 以0.5磅为单位的字体大小(font size in half-points)\fs21就是10.5pt,也就是小五号字
\outlinelevelN 段落的大纲级别。N取值范围0-8.
\b 加粗
\b0 不加粗
\pnhang 段落悬挂缩进
\fiN 首行缩进N个twips,twips与磅之间的换算公式为:1 twip=1/20 pt。要求缩进2个字符,2个字符一般是5号字,也就是缩进10.5pt,那么就应该是\fi-210
\liN 左边缩进N个twips
/*要想悬挂缩进,一般是\pnhang\fiN\liN三个选项连用,pnhang表示需要进行段落悬挂缩进,li表示左边缩进N个,fi-N表示首行往前N个字符。这样从第2行开始的就是悬挂缩进,而保持第一行不缩进*/
\brdrb 下框线
\brdrs 单条线
\ul 下划线
/**/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1838756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

application/x-www-form-urlencoded和json的区别

application/x-www-form-urlencoded 和 application/json 是两种不同的数据格式,常用于HTTP请求中传递数据。 它们各自的特点和使用场景如下: 1. application/x-www-form-urlencoded •特点:这是一种传统的表单提交时采用的编码类型&#x…

Jenkins+K8s实现持续集成(一)

镜像仓库的搭建 docker run -d \--restartalways \--name registry \-p 5000:5000 \-v /root/devops/registry/data:/var/lib/registry \registry安装完之后,执行下面命令可以看到镜像仓库已经安装成功 docker ps 然后在浏览器上输入下面地址进行访问 http://ip:…

高性价比MOS推荐:惠海HC090N10L,HC025N10L,100V高耐压,12V/24V加湿器和3.7V打火机专用MOS

加湿器MOS应用特点(HC090N10L,HC025N10L): 沟槽工艺,抗性好,不容易烧 可应用在1.8MHZ,2.4MHZ和3MHZ频率的加湿器 100V高耐压,MOS不容易尖峰击穿 加湿器缺水干烧MOS不易坏 加湿器出雾量大 …

路由框架 ARouter 原理及源码解析

文章目录 前言一、ARouter 简介二、ARouter 使用1.添加依赖和配置2.添加注解3.初始化SDK4.发起路由操作 三、ARouter 成员1. PostCard 明信片2. Interceptor 拦截器3. Warehouse 路由仓库4. ARouter 注解处理 四、ARouter 原理五、ARouter 源码分析1. ARouter 初始化1.1 ARoute…

美国ARC与延锋安全合作,推动汽车安全气囊技术新突破

在汽车安全领域,安全气囊作为关键被动安全配置,对于保障乘客生命安全至关重要。随着汽车工业的快速发展和科技创新的持续推进,安全气囊技术的升级与革新显得尤为重要。2022年10月25日,美国ARC公司与延锋安全携手合作,共…

产品交付能力提升的探索与分享

在当前激励的市场竞争环境下,对项目交付的成本和毛利要求越来越高。如何能快速高效地完成项目交付已然成为我们矢志追求的目标。抛开人为因素对项目交付效率的影响,产品本身的交付能力才是关键。因此,在设计新产品时需要考虑其便捷交付性&…

那些年我为了考PMP踩过的坑.....

说到考PMP我尊嘟很难过且伤心,众所周知,报考PMP都是要报机构的而且还是PMI认证的机构,所以在报考PMP过程中选的机构我可以说踩过了很多坑了...... Q:包过吗? 大家千万不要信某某机构说的包过噱头,真的很坑…

具身智能的视觉-语言-动作模型综合综述论文

近期arXiv公开了关于具身智能(Embodied AI)中的视觉-语言-动作模型(Vision-Language-Action Models,简称VLAs)的综合综述论文。介绍了VLAs的概念,它们是为了处理多模态输入而设计的模型,包括视觉…

用AI绘画生成网上爆火的治愈系插画,竟然轻松月入两万?!

大家好,我是向阳 一个月的时间,涨粉 2w,太猛了。这类作品,不仅涨粉能力强,变现能力也很强。 在第 11天的时候,就已经开始接商单变现了。 而这类账号,不仅仅只有接商单这一种变现模式。至于其…

Spire.PDF for .NET【文档操作】演示:如何删除 PDF 中的图层

借助Spire.PDF,我们可以在新建或现有pdf文档的任意页面中添加线条、图像、字符串、椭圆、矩形、饼图等多种图层。同时,它还支持我们从pdf文档中删除特定图层。 Spire.PDF for .NET 是一款独立 PDF 控件,用于 .NET 程序中创建、编辑和操作 PD…

用python和HY(lisp)代码为例学习什么是递归?

什么是递归? 看ANSI Common Lisp手册,里面提到递归第二章:欢迎来到 Lisp — ANSI Common Lisp 中文版,说:不要把递归看作一个普通函数来理解,因为普通函数经常被当成一个“机器”,原料从入口进…

2021数学建模A题目–“FAST”主动反射面的形状调节

A 题——“FAST”主动反射面的形状调节 思路:该题主要是通过利用伸缩杆调整FAST反射面,给出合适的调整方案 程序获取 第一题问题思路与结果: 当待观测天体S位于基准球面正上方,结合考虑反射面板调节因素,确定理想抛物…

消息队列的对比及适配的应用场景

消息队列的对比及适配的应用场景## 特性 / 消息队列KafkaRabbitMQActiveMQRedis消息模型发布-订阅、流处理队列、发布-订阅队列、发布-订阅发布-订阅协议支持自定义TCP协议、REST代理AMQP、STOMP、MQTTAMQP、OpenWire、STOMP、MQTT自定义协议可用性非常高,分区和副…

域权限维持之伪造域控

2022年1月10日,国外安全研究员Kaido发文称发现了一种新的伪造域控方式,安全研究员只需要新建一个机器账户,然后修改机器账户的UserAccountControl属性为8192。活动目录就会认为这个机器账户就是域控,然后就可以使用这个新建的机器…

STM32多功能交通灯系统:从原理到实现

一、功能说明 本交通灯系统采用先进的stm32f103c8t6微处理器为核心控制单元。系统设置东南西北四个方向各配置两位数码管,用以精准展示5至99秒的时间范围,并且允许用户根据实际需求进行灵活调整。 在信号灯配置方面,每个方向均配备左转、直…

在进行JD(京东)电商API大数据采集,针对商品详情数据、SKU数据以及价格分析时,关键是数据的准确性、完整性和分析的深度

一、项目背景 网上购物已经成为大众生活的重要组成部分。人们在电商平台上浏览商品并购物,产生了海量的用户行为数据,用户对商品的评论数据对商家具有重要的意义。利用好这些碎片化、非结构化的数据,将有利于企业在电商平台上的持续发展&…

已成功见刊检索的国际学术会议论文海报展示(2)

【先投稿先送审】第四届计算机、物联网与控制工程国际学术会议(CITCE 2024) 大会官网:www.citce.org 时间地点:2024年11月1-3日,中国-武汉 收录检索:EI Compendex,Scopus 主办单位:四川师范…

独立农作物区域-第13届蓝桥杯省赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第86讲。 独立农作物区域&a…

食品企业仓储式批发零售一体化解决方案

食品企业需要有效应对日益复杂的市场挑战和消费者需求的快速变化的挑战并提升市场竞争力,仓储式类的批发零售一体化需求应运而生。这一全新的商业模式不仅整合了传统的批发和零售模式,还优化了供应链管理和客户体验,成为食品行业发展的新引擎…

docker安装Jumpserver

docker安装Jumpserver 简介 JumpServer 是广受欢迎的开源堡垒机,是符合 4A 规范的专业运维安全审计系统。 JumpServer 堡垒机帮助企业以更安全的方式管控和登录各种类型的资产,包括: SSH: Linux / Unix / 网络设备 等; Windows:…