天道酬勤,学无止境

How do I create a cumulative median field in SAS VA 7.4 Designer?

Consider a List Table in VA 7.4 Designer. It has only two fields (Month, Median Patients). The desire is to calculate the cumulative median over the months. This cumulative median is labelled as "Median Patients". An example data with more descriptive steps is attached.

Please, take look. Note: It's easy to calculate the monthly Median Patients by just using the median function in VA 7.4 Designer (not the desire). The cumulative median is desired.

Thank you and have fun.`

Sample Data
-------------
Account ID  Month       #patients
----------  -------     ----------
1       Jan2017     5
2       Jan2017     3
3       Feb2017     7
4       Feb2017     6
5       Feb2017     2
6       Mar2017     4
7       Apr2017     1
8       Apr2017     10
9       Apr2017     9
10      Apr2017     3



Typical calculation in SAS VA 7.4
-----------------------------------
Monthly Median (Easy using median function)
-------------------------------------------
Month       Median Patients
---------   ---------------     
Jan2017     4       ( 5+3 ) /2
Feb2017     6       middle of ( 2,6,7 )
Mar2017     4       
Apr2017     6       middle of ( 1,3,9,10 )  = (3+9)/2 = 6



Cumulative Monthly Median (Desired in SAS VA 7.4) Any idea how to calculate this assuming this is in a List Table with only two fields (Month and Median Patients)?
------------------------------------------------------------------------------------------------------------------------------------------------------------
Month       Median Patients
--------    -----------------
Jan2017     4       ( 5+3 ) /2
Feb2017     5       middle of ( 2,3,5,6,7 )     = 5
Mar2017     5       middle of (2,3,4,5,6,7 )    = (4+5) /2 = 4.5(approx. 5 when rounded)
Apr2017     5       middle of(1,2,3,3,4,5,6,7,9,10) = (4+5) /2 = 4.5(approx. 5 when rounded)
标签

评论

To do this via SAS Code; I Left Join the segregated data to itself on month <= month (to calculate the cumulative median for each month).

Data:

data have;
 infile datalines dlm=',' dsd;
 informat Month monyy7.;
 format Month monyy7.;
 input Account_ID  Month    patients;
 datalines;
1,Jan2017,5
2,Jan2017,3
3,Feb2017, 7
4,Feb2017,6
5,Feb2017, 2
6,Mar2017 , 4
7,Apr2017,1
8,Apr2017,10
9,Apr2017, 9
10, Apr2017 ,3
;
run;

Cumulative Median:

proc sql;
create table want as 
select t1.Month , median(t2.patients) as Cumm_Median , round(median(t2.patients)) as Cumm_Median_rounded
from have as t1 left join have as t2
on t2.Month le t1.month
group by t1.month
order by t1.Month
;
quit;

Output:

 Month=JAN2017 Cumm_Median=4 Cumm_Median_rounded=4
 Month=FEB2017 Cumm_Median=5 Cumm_Median_rounded=5
 Month=MAR2017 Cumm_Median=4.5 Cumm_Median_rounded=5 
 Month=APR2017 Cumm_Median=4.5 Cumm_Median_rounded=5

In VA Designer:

  1. Create a date parameter called monthyear and assign it same format as you Month field,
  2. In the body of your report Create a drop-down & List-Table objects,
  3. Assign the Month field to the drop-down, then go to roles tab and in the parameter box select monthyear ; which you just created,
  4. Select the List-Table, assign Month, Patient (make sure the aggregation is median) then go to the filters tab and create advances filter using the point and click: Month <= monthyear
  5. Now the interaction is setup, make sure when you select a date from drop down you see the correct data to calculate, monthly median will be calcualted

  1. Remove the Month/Date field from the table then the Cumulative Median will be calculated

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • cumulative max by group in SAS or PROC SQL
    I want to compute a cumulative max grouped by another column. Say I have this data: data have; input grp $ number; datalines; a 3 b 4 a 5 b 2 a 1 b 8 ; My desired output would be: data want; input grp $ cummax; a 3 b 4 a 5 b 4 a 5 b 8 ; My real case will involve several grouping columns + filters, and ideally this cumulative max would be computed on several columns at the same time. My main concern is computational efficiency as I'll be running this on tables of ten to hundred millions of rows. Proc SQL or native SAS are both welcome. Rows might be shuffled if necessary. System Info proc
  • 如何计算分组数据集的中位数?(how to calculate the median on grouped dataset?)
    问题 我的数据集如下: salary number 1500-1600 110 1600-1700 180 1700-1800 320 1800-1900 460 1900-2000 850 2000-2100 250 2100-2200 130 2200-2300 70 2300-2400 20 2400-2500 10 如何计算此数据集的中位数? 这是我尝试过的: x <- c(110, 180, 320, 460, 850, 250, 130, 70, 20, 10) colnames <- "numbers" rownames <- c("[1500-1600]", "(1600-1700]", "(1700-1800]", "(1800-1900]", "(1900-2000]", "(2000,2100]", "(2100-2200]", "(2200-2300]", "(2300-2400]", "(2400-2500]") y <- matrix(x, nrow=length(x), dimnames=list(rownames, colnames)) data.frame(y, "cumsum"=cumsum(y)) numbers cumsum [1500-1600] 110 110 (1600-1700] 180 290 (1700-1800] 320 610
  • Using describe() with weighted data — mean, standard deviation, median, quantiles
    I'm fairly new to python and pandas (from using SAS as my workhorse analytical platform), so I apologize in advance if this has already been asked / answered. (I've searched through the documentation as well as this site searching for answer and haven't been able to find something yet.) I've got a dataframe (called resp) containing respondent level survey data. I want to perform some basic descriptive statistics on one of the fields (called anninc [short for annual income]). resp["anninc"].describe() Which gives me the basic stats: count 76310.000000 mean 43455.874862 std 33154.848314 min 0
  • 对加权数据使用 describe() — 均值、标准差、中位数、分位数(Using describe() with weighted data — mean, standard deviation, median, quantiles)
    问题 我对 python 和 Pandas 还很陌生(使用 SAS 作为我的主力分析平台),所以如果有人问过/回答过这个问题,我提前道歉。 (我已经搜索了文档以及此站点以寻找答案,但还没有找到。) 我有一个包含受访者级别调查数据的数据框(称为 resp)。 我想对其中一个领域(称为 anninc [年收入的简称])进行一些基本的描述性统计。 resp["anninc"].describe() 这给了我基本的统计数据: count 76310.000000 mean 43455.874862 std 33154.848314 min 0.000000 25% 20140.000000 50% 34980.000000 75% 56710.000000 max 152884.330000 dtype: float64 但有一个问题。 鉴于样本是如何构建的,需要对受访者数据进行权重调整,以便在执行分析时并非每个人都被视为“平等”。 我在数据框中有另一列(称为 tufnwgrp),表示在分析过程中应应用于每条记录的权重。 在我之前的 SAS 生活中,大多数 proc 都可以选择使用这样的权重来处理数据。 例如,给出相同结果的标准 proc 单变量如下所示: proc univariate data=resp; var anninc; output out=resp_univars mean
  • Macro that outputs table with testing results of SAS table
    Problem I'm not a very experienced SAS user, but unfortunately the lab where I can access data is restricted to SAS. Also, I don't currently have access to the data since it is only available in the lab, so I've created simulated data for testing. I need to create a macro that gets the values and dimensions from a PROC MEANS table and performs some tests that check whether or not the top two values from the data make up 90% of the results. As an example, assume I have panel data that lists firms revenue, costs, and profits. I've created a table that lists n, sum, mean, median, and std. Now I
  • 累积粘贴(连接)由另一个变量分组的值(Cumulatively paste (concatenate) values grouped by another variable)
    问题 我在处理R中的数据帧时遇到问题。我想根据另一列中单元格的值将不同行中单元格的内容粘贴到一起。 我的问题是我希望输出是逐步(累积)打印的。 输出向量的长度必须与输入向量的长度相同。 这是一个与我正在处理的样本表相似的样本表: id <- c("a", "a", "a", "b", "b", "b") content <- c("A", "B", "A", "B", "C", "B") (testdf <- data.frame(id, content, stringsAsFactors=FALSE)) # id content #1 a A #2 a B #3 a A #4 b B #5 b C #6 b B 这就是我希望结果看起来像这样: result <- c("A", "A B", "A B A", "B", "B C", "B C B") result #[1] "A" "A B" "A B A" "B" "B C" "B C B" 我不需要这样的东西: ddply(testdf, .(id), summarize, content_concatenated = paste(content, collapse = " ")) # id content_concatenated #1 a A B A #2 b B C B 回答1 您可以使用Reduce定义“累积粘贴”功能
  • Cumulative mean with conditionals
    New to R. Small rep of my df: PTS_TeamHome <- c(101,87,94,110,95) PTS_TeamAway <- c(95,89,105,111,121) TeamHome <- c("LAL", "HOU", "SAS", "MIA", "LAL") TeamAway <- c("IND", "LAL", "LAL", "HOU", "NOP") df <- data.frame(cbind(TeamHome, TeamAway,PTS_TeamHome,PTS_TeamAway)) df TeamHome TeamAway PTS_TeamHome PTS_TeamAway LAL IND 101 95 HOU LAL 87 89 SAS LAL 94 105 MIA HOU 110 111 LAL NOP 95 121 Imagine these are the first four games of a season with 1230 games. I want to calculate the cumulative points per game (mean) at any given time for the home team and the visiting team. The output would look
  • Seaborn中标值的箱形图(Labeling boxplot in seaborn with median value)
    问题 我如何用中位数标记海洋图中的每个箱线图? 例如 import seaborn as sns sns.set_style("whitegrid") tips = sns.load_dataset("tips") ax = sns.boxplot(x="day", y="total_bill", data=tips) 如何用中位数或平均值标记每个箱线图? 回答1 我喜欢人们包含样本数据集! import seaborn as sns sns.set_style("whitegrid") tips = sns.load_dataset("tips") box_plot = sns.boxplot(x="day",y="total_bill",data=tips) medians = tips.groupby(['day'])['total_bill'].median() vertical_offset = tips['total_bill'].median() * 0.05 # offset from median for display for xtick in box_plot.get_xticks(): box_plot.text(xtick,medians[xtick] + vertical_offset,medians[xtick]
  • 输出带有 SAS 表测试结果的表的宏(Macro that outputs table with testing results of SAS table)
    问题 问题 我不是一个非常有经验的 SAS 用户,但不幸的是,我可以访问数据的实验室仅限于 SAS。 此外,我目前无法访问数据,因为它仅在实验室中可用,因此我创建了用于测试的模拟数据。 我需要创建一个宏来从PROC MEANS表中获取值和维度,并执行一些测试来检查数据中的前两个值是否占结果的 90%。 例如,假设我有列出公司收入、成本和利润的面板数据。 我创建了一个表格,其中列出了 n、sum、mean、median 和 std。 现在我需要检查前两家公司是否占结果的 90%,如果是,则标记是利润、收入还是成本占 90%。 我不知道如何开始 以下是步骤: 读取数据读取创建的PROC MEAN表,获取维度和变量。 获取每个变量中的前两个公司并执行检查创建新表,列出变量、读取表中的值、最大和第二大以及标志。 然后打印表格 模拟数据: https://www.dropbox.com/s/ypmri8s6i8irn8a/dataset.csv?dl=0 PROC 均值表 proc import datafile="/folders/myfolders/dataset.csv" out=dt dbms=csv replace; getnames=yes; run; TITLE "Macro Project Sample"; PROC MEANS n sum mean median std
  • 如何利用MATLAB对数据统计分析?
    文章目录 0前言1 求最大元素与最小元素2 求平均值与中值3 求和与求积4 累加和与累乘积5 求标准差与相关系数6 排序7 结语 0前言 本文是科学计算与MATLAB语言的专题6的第1小节总结笔记,并结合了自己一点的理解,看完本文,可以轻松借助MATLAB对数据进行分析,如求矩阵或向量的最大元素、最小元素、平均值、中值等等。 1 求最大元素与最小元素 max():求向量或矩阵的最大元素。 min():求向量或矩阵的最小元素。 当参数为向量时,上述函数有两种调用格式: (1)y=max(X):返回向量x的最大值存入y,如果X中包含复数元素,则按模取最大值。 (2)[y,k]=max(X):返回向量x的最大值存入y,最大值元素的序号存入k,如果X中包含复数元素,则按模取最大值。 例1求向量x的最大元素,其中x=[-43,72,9,16,23,47]。 x=[-43,72,9,16,23,47]; y=max(x) y=72 [y,k]=max(x) y=72 k=2 当参数为矩阵时,函数有三种调用格式: (1)max(A):返回一个行向量,向量的第i个元素是矩阵A的第i列上的最大值。 也就是说将矩阵的每一列中最大的元素记录下来,并生成一个行向量。 (2)[Y,U]=max(A):返回行向量Y和U,Y向量记录A中每列的最大值,U向量记录每列最大值元素的行号。 (3)max(A,[]
  • NumPy: calculate cumulative median
    I have sample with size = n. I want to calculate for each i: 1 <= i <= n median for sample[:i] in numpy. For example, I counted mean for each i: cummean = np.cumsum(sample) / np.arange(1, n + 1) Can I do something similar for the median without cycles and comprehension?
  • how to calculate the median on grouped dataset?
    My dataset is as following: salary number 1500-1600 110 1600-1700 180 1700-1800 320 1800-1900 460 1900-2000 850 2000-2100 250 2100-2200 130 2200-2300 70 2300-2400 20 2400-2500 10 How can I calculate the median of this dataset? Here's what I have tried: x <- c(110, 180, 320, 460, 850, 250, 130, 70, 20, 10) colnames <- "numbers" rownames <- c("[1500-1600]", "(1600-1700]", "(1700-1800]", "(1800-1900]", "(1900-2000]", "(2000,2100]", "(2100-2200]", "(2200-2300]", "(2300-2400]", "(2400-2500]") y <- matrix(x, nrow=length(x), dimnames=list(rownames, colnames)) data.frame(y, "cumsum"=cumsum(y)) numbers
  • 删除时间序列中的峰值和步骤等跳跃(Remove jumps like peaks and steps in timeseries)
    问题 我在现场有很多传感器可以测量水压。 过去,这些传感器的高度已多次更改,从而在时间序列中产生跳跃。 由于这些时间序列是连续的,并且我有手动测量,因此从技术上讲,我应该能够消除跳跃(手动这很容易,但是测量太多,所以我需要在 python 中进行)。 我试过使用中值滤波器去除跳跃,但这并没有真正起作用。 我的代码: # filter out noise in signal (peaks) minimumPeak = 0.03 # filter peaks larger than 0.03m filtered_value = np.array(im.median_filter(data['value'], 5)) noise = np.array((filtered_value-data['value']).abs() > minimumPeak) data.loc[noise, 'value'] = filtered_value[noise] 数据是包含两列的熊猫数据框:“日期时间”和“值”。 我也尝试过手动执行此操作并使其在一个简单的情况下工作,但在其他情况下效果不佳。 知道如何过滤掉跳跃吗? 下图显示了一个示例(黄色表示跳跃,红色表示手动测量(这个测量很可能不是在这个示例中的开始)) 回答1 您的数据中有尖锐的峰值和步长。 我猜你想
  • SQL Server Reporting Services中的均值,中位数模式(mean, median, mode in SQL Server Reporting Services)
    问题 是否可以计算一列数据的平均值,中位数,众数,标准差等? 通常,是否可以在SQL Server Reporting Services中进行这类数学计算? 如果是这样,怎么办? 回答1 扩展@Homer的答案,下面的代码可用于获取中位数和模式。 我需要整数,但是接受Decimal或Double会是一个快速的更改。 Dim values As New System.Collections.Generic.List(Of Integer) Dim valueCounts As New System.Collections.Generic.Dictionary(Of Integer, Integer) Function AddValue(newValue As Integer) As Integer values.Add(newValue) AddValue = newValue If Not valueCounts.ContainsKey(newValue) Then valueCounts.item(newValue) = 1 Else valueCounts.item(newValue) += 1 End If End Function Function GetMedian() As Double Dim count As Integer = values.Count If
  • 详解用 matplotlib 绘制动态条形图
    详解用 matplotlib 绘制动态条形图 端午安康! 近日看到联合国网站提供的世界人口数据集,其中一个子数据集包含了各国 1950-2015年的人口数据。 假日值班,有自由的时间,就基于这个数据集,用 matplotlib 实现了一个世界人口 66 年变化的动态条形图。 最后的 gif 图: 下面把实现的主要步骤记录下来。原始数据、详细的源代码请到 QQ群:python草堂,457079928 下载,有问题也可以到那里讨论。 数据集介绍 ‘population_estimates.csv’ ,逗号分隔符,utf-8编码,csv格式。 18018 rows × 4 columns 有4 个字段: Region,国家和地区的英文名称;Country Code,国家和地区的代码;Year,4位数的年份;Population,人口数,单位:千人。 不仅有各个国家的人口数据,还包括大的地区的人口统计数据,如世界总人口,亚洲、东亚、北美洲等。 导入用到的库 %matplotlib inline import pandas as pd import numpy as np import pprint import matplotlib.pyplot as plt import matplotlib.ticker as ticker import matplotlib.animation as
  • 遇到0时重置的累积和(Cumulative sum that resets when 0 is encountered)
    问题 我想在一个字段上做一个累加和,但是每当遇到一个0时就重置聚合值。 这是我想要的示例: data.frame(campaign = letters[1:4] , date=c("jan","feb","march","april"), b = c(1,0,1,1) , whatiwant = c(1,0,1,2) ) campaign date b whatiwant 1 a jan 1 1 2 b feb 0 0 3 c march 1 1 4 d april 1 2 回答1 另一个基础就是 with(df, ave(b, cumsum(b == 0), FUN = cumsum)) ## [1] 1 0 1 2 这将根据0出现将b列划分为组,并计算这些组中b的累积和 使用最新data.table版本(v 1.9.6+)的另一种解决方案 library(data.table) ## v 1.9.6+ setDT(df)[, whatiwant := cumsum(b), by = rleid(b == 0L)] # campaign date b whatiwant # 1: a jan 1 1 # 2: b feb 0 0 # 3: c march 1 1 # 4: d april 1 2 每个评论的一些基准 set.seed(123) x <- sample(0:1e3
  • SAS:重新排列数据步骤中的字段顺序(SAS: rearrange field order in data step)
    问题 在SAS 9中,如何在一个简单的数据步骤中重新排列字段的顺序。 Data set2; /*Something probably goes here*/ set set1; run; 因此,如果set1具有以下字段: Name Title Salary A Chief 40000 B Chief 45000 然后,我可以将set2的字段顺序更改为: Title Salary Name Chief 40000 A Chief 45000 B 谢谢, 和 回答1 一些快速谷歌搜索给了我这种方法: data set2; retain title salary name; set set1; run; 从这里:http://analytics.ncsu.edu/sesug/2002/PS12.pdf 回答2 如果数据集中的变量数量很大,有时使用sql语句而不是datastep会更容易。 这样,您可以仅列出您关心的变量,并使用通配符保留其他所有内容。 proc sql noprint; create table set2 as select title, salary, * from set1; quit; 如果使用大型表执行此操作,则可以通过创建视图来节省IO开销。 这可以应用于数据集方法或proc sql方法。 proc sql noprint; create view set2
  • 如何在R语言中建立六边形矩阵热图heatmap可视化
    原文链接:http://tecdat.cn/?p=18879 这是一个六边形热图可视化程序,主要用到的知识RColorBrewer,fields,也就是R中的可视化绘图库。 本文希望SOM的结果以六边形热图可视化。让我向您展示如何在R中创建六边形热图! 您必须根据自组织神经网络(SOM)的结果来创建自己的变量 。输入变量 Heatmap_Matrix 变量是一个矩阵,可以作为热图的数字表示。 因此,矩阵具有与SOM映射相同的行数和与SOM映射相同的列数,并且热图中的每个值表示一个六边形的值。这里 [1,1] 将成为左下节点(第一行,第一列),[1,2] 将成为右侧的节点, 将成为 [2,1] 第二行中左侧的第一个节点,依此类推。因此,从视觉上看,顺序从左下到右上,而在矩阵中,则从左上到右下。 码 library(RColorBrewer) #使用brewer.pal library(fields) #使用designer.colors #为每个六角形创建多边形的功能 #从一个矩阵开始,该矩阵将作为您的热图的数字表示形式,称为Heatmap_Matrix x <- as.vector(map_Matrix) #此矩阵具有与SOM映射相同的行数和与SOM映射相同的列数,并且热图中的每个值表示一个六边形的值 #在这里[1,1]将成为左下节点(第一行,第一列),[1,2]将成为右节点[2
  • NumPy或SciPy以计算加权中位数(NumPy or SciPy to calculate weighted median)
    问题 我正在尝试自动化JMP所做的过程(“分析”->“分布”,将列A输入为“ Y值”,并使用后续列​​作为“权重”值)。 在JMP中,您必须一次完成一列-我想使用Python遍历所有列并创建一个数组,例如显示每列的中位数。 例如,如果质量数组为[0、10、20、30],列1的权重数组为[30、191、9、0],则质量数组的加权中位数应为10。我不确定如何得出这个答案。 到目前为止,我已经 将显示权重的csv导入为数组,掩码值为0,并且创建了一个与权重数组(113x32)具有相同形状和大小的“ Y值”数组。 我不确定是否需要执行此操作,但是出于加权的目的,我认为它比for循环更容易。 我不确定从这里到底要去哪里。 基本上,“ Y值”是一个质量范围,并且数组中的所有列均代表为每个质量找到的数据点的数量。 我需要根据报告的频率找到中位质量。 我不是Python或统计专家,因此,如果我省略了任何有用的细节,请告诉我! 更新:这是到目前为止我所做的一些代码: #Boilerplate & Import files import csv import scipy as sp from scipy import stats from scipy.stats import norm import numpy as np from numpy import genfromtxt import
  • 从 ORACLE DB 通过 SAS 导入 blob(Import blob through SAS from ORACLE DB)
    问题 给大家一天的好时光。 我在上周的工作中遇到了一个大问题。 这是交易: 我需要通过 SAS 从 ORACLE 数据库下载 exel 文件(blob)。 我在用: 第一步我需要从oracle获取数据。 我使用了构造(blob 文件将近 100kb): proc sql; connect to oracle; create table SASTBL as select * from connection to oracle ( select dbms_lob.substr(myblobfield,1,32767) as blob_1, dbms_lob.substr(myblobfield,32768,32767) as blob_2, dbms_lob.substr(myblobfield,65535,32767) as blob_3, dbms_lob.substr(myblobfield,97302,32767) as blob_4 from my_tbl; ); quit; 结果是: blob_1 = 70020202020202...02 blob_2 = 02020202020...02 blob_3 = 02020202...02 我不明白为什么该字段由“02”(整个文件)组成 并且 sas 中任何变量的长度都是 1024(而不是 37767)$HEX2024 格式。