Ввод данных в SAS с использованием циклов

Hypergeometry спросил: 28 марта 2018 в 03:49 в: loops

Я только что узнал о цикле "do" сегодня и хотел бы попробовать использовать его для ввода данных в SAS. Я пробовал большинство примеров в Интернете, но я все еще не могу понять.

Мой набор данных в эксперименте с 6 сеансами (от 1 до 6) с использованием 2 наборов сигналов, по 3 для каждого, для Visual и Audio. Есть задержка, измеренная в секундах, которая составляет 5, 10 и 15, что составляет 2 набора. В основном это выглядит так: Таблица

Я хочу: 1. Obs_no, от 1 до 18 (всего 18 наблюдений, это позволяет мне легко удалять выбросы с помощью IF THEN) 2. Тип лечения, которые являются слуховыми и визуальными. Номер лечения, от 1 до 6, 3 комплекта. Lag, 5, 10 или 15.5. И сами данные

Пока мой код делает возможными 2 и 5, он также делает все возможное с инструкцией IF THEN и инструкцией ввода, хотя я предполагаю, что есть способ проще:

data AVCue; 
do cue = 'Auditory','Visual';
    do i = 1 to 3;
        input AVCue @@;
        output;
        end;
    end;
datalines;
.204 .167 .202 .257 .283 .256 
.170 .182 .198 .279 .235 .281
.181 .187 .236 .269 .260 .258
;

Отложить, а остальное стало возможным с использованием инструкции IF THEN и грубого метода ввода:

data AVCue;
set AVCue;
IF i=1 THEN Lag=5;
IF i=2 THEN Lag=10;
IF i=3 THEN Lag=15;
input obs_no treatment;
cards;
1 1
2 2
3 3
4 4
5 5
6 6
7 1
8 2
9 3
10 4
11 5
12 6
13 1
14 2
15 3
16 4
17 5
18 6
;
proc print data=AVCue;
run;

IF THEN должно быть в порядке, но входной оператор здесь на мой взгляд контрпродуктивен и поражает цель использования петель, которые для меня, чтобы сэкономить время. Если это будет сделано, я мог бы просто поместить данные в excel и импортировать его, или напечатать все с достаточной копией и вставкой текста в input obs_no treatment; cards; .section.

Мои знания в области кодирования являются основными, поэтому извините, если этот вопрос звучит глупо, я хочу знать: 1. Как мне составить список чисел, используя петли do do в SAS? Я сделал несколько попыток, и все, что я получаю, это список, содержащий следующий номер. Я знаю, почему это происходит, цикл считается х, а назначенное значение будет просто x. Я просто не знаю, как обойти это. Как-то это не произошло в разделе datalines, я думаю, SAS знает, что есть 18 номеров, и запись i хранится соответственно ... или что-то еще? 2. Как я мог бы назначить в этом случае цифры от 1 до 6 каждой записи?

Спасибо!


1 ответ

Есть решение
Tom ответил: 29 марта 2018 в 12:30

Конечно, гораздо проще читать в фактическом наборе данных, чем вменять некоторые переменные в зависимости от порядка значений в исходных данных. Возможно, вы сможете объединить оператор SET и оператор INPUT на одном шаге данных и заставить его работать, но это, вероятно, НЕ стоит усилий. Просто создайте два набора данных и объедините их.

Глядя на фотографию, которую вы разместили, похоже, что TREATMENT не является независимой переменной. Вместо этого это просто ярлык для комбинации CUE и LAG. Чтобы сделать цикл с 1 по 6, просто сбросьте его на 1, когда он станет слишком большим.

data AVCue; 
  do cue = 'Auditory','Visual';
    do lag= 5, 10, 15 ;
        treatment+1;
        if treatment=7 then treatment=1;
        obsno+1;
        input AVCue @@;
        output;
    end;
  end;
datalines;
.204 .167 .202 .257 .283 .256 
.170 .182 .198 .279 .235 .281
.181 .187 .236 .269 .260 .258
;

Вы можете столкнуться с проблемами, если просто дадите SAS угадать, как вы хотите определить ваши переменные. Например, если вы измените порядок значений CUE do cue = 'Visual','Auditory';, тогда SAS создаст CUE длиной $ 5 вместо $ 8. Добавьте оператор LENGTH, чтобы определить свои переменные до того, как вы их используете.

length obsno 8 treatment 8 cue $8 lag 8 AVCue 8 ;

Это также позволит вам контролировать порядок их создания в наборе данных.

Hypergeometry ответил: 29 марта 2018 в 08:53
Извините за путаницу, есть 2 типа сигналов и 3 значения задержки, 2 3 = 6 делает обработку. Каждое лечение применяется к 3 единицам, что составляет всего 18 единиц. Я включил таблицу в вопросе.
Hypergeometry ответил: 29 марта 2018 в 08:54
.257, .283 и .256 визуально, а затем обратно в слух. i.stack.imgur.com/oUwkB.jpg Спасибо за пример кода, хотя я постараюсь немного его изменить.
Tom ответил: 29 марта 2018 в 11:46
Обновлен для удаления лечения в качестве независимой переменной.