Базовое среднее значение по темам посещений (SAS) - PullRequest
1 голос
/ 05 апреля 2020

Я пытаюсь рассчитать базовые средние значения при конкретном c посещении. Например, если у субъекта нет определенного посещения, базовое среднее значение будет пересчитано без учета предмета.

Вот данные:

Subject            Visit              Value
001                Baseline           10
001                Visit 2            11
001                Visit 3            12
001                Visit 4            13
002                Baseline           11
002                Visit 2            12
002                Visit 4            13
002                Visit 5            14
003                Baseline           12
003                Visit 3            13
003                Visit 4            14
003                Visit 5            15

Я хотел бы получить следующее:

Visit             BaselineMean       VisitMean
Baseline          11                 11
Visit 2           10.5               11.5
Visit 3           11                 12.5
Visit 4           11                 13.3
Visit 5           11.5               14.5

Вот таблица, которую я имею для среднего значения при каждом посещении :

proc sql;
create table want as
select 
    visit, 
    mean(value) as meanValue
from have
group by visit;

Любое понимание будет с благодарностью.

Ответы [ 3 ]

1 голос
/ 05 апреля 2020

сначала создайте таблицу с базовым значением для каждого предмета следующим образом:

proc sql;
create table baseline as 
    select distinct subject, value
        from t1
    where visit = 'Baseline'
;

, а затем дополните основную таблицу базовым значением. Обратите внимание, что объединение используется, если для субъекта нет базовой записи:

proc sql;
    create table inter as 
        select t1.*m, coalesce(b.value, 0) as b_val 
            from t1 left join baseline b  
                on t1.subject = b.subject
;
quit;

, наконец, рассчитайте средние значения для базовой линии и посещений следующим образом:

  proc sql;
        select visit, mean(b_val) as BaselineMean, mean(value) as visitMean
            from inter 
    group by visit
;
quit;
1 голос
/ 07 апреля 2020

Вы можете вычислить агрегированную статистику по подвыбору, который сам использует коррелированный подзапрос, который выбирает базовое значение субъекта.

proc sql;
  create table want as
  select 
    visit
  , mean(baseline) as baselinemean format=5.1
  , mean(value) as visitmean       format=5.1
  from 
    ( select 
        visit
      , value
      , ( select value 
          from have as inner 
          where inner.subject = outer.subject 
            and inner.visit='Baseline'
        ) as baseline
      from have as outer
    )
  group by visit
  ;
quit;
1 голос
/ 05 апреля 2020

Рассмотрим объединение двух агрегатов, одно из которых использует само-соединение:

proc sql;
   CREATE TABLE want as 
   SELECT bagg.Visit, bagg.BaselineMean, vagg.VisitMean
   FROM 
     (SELECT t2.Visit, MEAN(t1.Value) AS BaselineMean
      FROM have t1
      INNER JOIN have t2
         ON t1.Subject = t2.Subject 
        AND t1.Visit = 'Baseline'
      GROUP BY t2.Visit) bagg

   INNER JOIN
     (SELECT Visit, MEAN(Value) AS VisitMean
      FROM have 
      GROUP BY Visit) vagg
   ON bagg.Visit = vagg.Visit;
quit;

SQL Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...