Использование циклов do в sas - PullRequest
0 голосов
/ 04 мая 2020

Предположим, у вас есть файл данных VIRUS_PROLIF из центра исследований инфекционных заболеваний. Каждое наблюдение имеет 3 переменные COUNTRY START_DATE и DOUBLE_RATE, где START_DATE - это дата, когда Страна зарегистрировала свой сотый случай COVID-19. DOUBLE_RATE для каждой страны - это количество дней, необходимое для удвоения количества дел в этой стране. Напишите код SAS, используя DO UNTIL, чтобы рассчитать дату, на которую в этой стране будет зарегистрировано 200 000 случаев COVID-19.

  data VIRUS_PROLIF;
INPUT COUNTRY $ start_date mmddyy10. num_of_cases double_rate ;
*here doubling rate is 100% so if day 1 had 100 cases day 2 will have 200;
 Datalines;
 US 03/13/2020 100 100
  ;
 run;

data VIRUS_PROLIF1 (drop=start_date);
set VIRUS_PROLIF;
 do until (num_of_cases>200000);
double_rate+1;
num_of_cases+ (num_of_cases*1);
end;
 run;
 proc print data=VIRUS_PROLIF1;
 run;

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Проблема 200,000 0 (1 + R / 100) k может быть решена для целых чисел k без итераций

   day_of_200K = ceil ( 
        LOG ( 200000 / NUM_OF_CASES ) 
      / LOG ( 1 + R / 100 ) 
    );   
0 голосов
/ 04 мая 2020

Ключевое понятие, которое вам здесь не хватает, - это как использовать темп роста. Это будет использовать следующую формулу, похожую на рост процента за деньги.

Если у вас есть один доллар сегодня, и вы получаете 100%, он становится StartingAmount * (1 + interestRate), где процентная ставка здесь составляет 100/100 = 1.

*fake data;

data VIRUS_PROLIF;
    INPUT COUNTRY $ start_date mmddyy10. num_of_cases double_rate;
    *here doubling rate is 100% so if day 1 had 100 cases day 2 will have 200;
    Datalines;
US 03/13/2020 100 100
AB 03/17/2020 100 20
;
run;

data VIRUS_PROLIF1;
    set VIRUS_PROLIF;
    *assign date to starting date so both are in output;
    date=start_date;
    *save record to data set;
    output;

    do until (num_of_cases>200000);
        *increment your day;
        date=date+1;
        ;
        *doubling rate is represented as a percent so add it to 1 to show the rate;
        num_of_cases=num_of_cases*(1+double_rate/100);
        *save record to data set;
        output;
    end;
    *control date display;
    format date start_date date9.;
run;

*check results;

proc print data=VIRUS_PROLIF1;
run;
...