使用rnorm连续创建数据,直到R

时间:2015-07-09 15:07:08

标签: r while-loop repeat

对于令人困惑的标题感到抱歉,但我不确定如何标题我想要做的事情。我的目标是创建一个1000个数据集,每个数据集将是运行的长度。我创建了一个phase1数据集,从中生成一组控制限制。我现在要做的是创建一个最有可能使用rnorm的phase2数据集。我想要做的是创建一个重复循环,它将在phase2数据集中连续创建值,直到其中一个值超出phase1数据集产生的控制限制。例如,如果我有3.0和-3.0作为控制限制,phase2数据集将创建一组观察,直到obs 398,此时值恰好为3.45,从而停止数据的创建。我的目标是记录数字398.此外,我然后尝试将代码循环回phase1数据集/控制限制部分并创建一组新的控制限制,然后运行另一个阶段2,直到我记录了1000个运行长度。我对phase1 / control限制的代码工作正常,看起来像这样:

nphase1=50
nphase2=1000
varcount=1
meanshift= 0
sigmashift= 1


##### phase1 dataset/ control limits #####

phase1 <- matrix(rnorm(nphase1*varcount, 0, 1), nrow = nphase1, ncol=varcount)
mean_var <- apply(phase1, 2, mean)
std_var <- apply(phase1, 2, sd)
df_var <- data.frame(mean_var, std_var)

Upper_SPC_Limit_Method1 <- with(df_var, mean_var + 3 * std_var)
Lower_SPC_Limit_Method1 <- with(df_var, mean_var - 3 * std_var)
df_control_limits<- data.frame(Upper_SPC_Limit_Method1, Lower_SPC_Limit_Method1) 

我以前在SAS中创建过此代码,看起来像这样。可能是我试图解释它的更好的参考。

%macro phase2_dataset (n=,varcount=, meanshift=, sigmashift=, nphase1=,simID=,);
%do z=1 %to &n;
 %phase1_dataset (n=&nphase1, varcount=&varcount);
    data phase2; set control_limits n=lastobs;
       call streaminit(0);
       do until (phase2_var1<Lower_SPC_limit_method1_var1 or
                 phase2_var1>Upper_SPC_limit_method1_var1);
        phase2_var1 = rand("normal", &meanshift, &sigmashift); 
        output;
        end;

    run;
 ods exclude all; 
 proc means data=phase2;
 var phase2_var1;
 ods output summary=x;
 run; 
 ods select all; 
 data run_length; set x;
 keep Phase2_var1_n;
 run; 
proc append base= QA.Phase2_dataset&simID data=Run_length force; run;    
%end;
%mend; 

还在研究如何使用while循环替换重复循环。  我是R的新手所以非常感谢你能提出的任何想法。谢谢!

1 个答案:

答案 0 :(得分:0)

使用while循环确实似乎是要走的路。以下是我认为您正在寻找的内容:

set.seed(10) #Making results reproducible

replicate(100, { #100 is easier to display here
  phase1 <- matrix(rnorm(nphase1*varcount, 0, 1), nrow = nphase1, ncol=varcount)
  mean_var <- colMeans(phase1) #Slightly better than apply
  std_var <- apply(phase1, 2, sd)
  df_var <- data.frame(mean_var, std_var)

  Upper_SPC_Limit_Method1 <- with(df_var, mean_var + 3 * std_var)
  Lower_SPC_Limit_Method1 <- with(df_var, mean_var - 3 * std_var)
  df_control_limits<- data.frame(Upper_SPC_Limit_Method1, Lower_SPC_Limit_Method1)

  #Phase 2

  x <- 0
  count <- 0

  while(x > Lower_SPC_Limit_Method1 && x < Upper_SPC_Limit_Method1) {
    x <- rnorm(1)
    count <- count + 1
  }
  count
})

结果是:

  [1]  225   91   97  118  304  275  550   58  115    6  218   63  176  100  308  844   90 2758
 [19]  161  311 1462  717 2446   74  175   91  331  210  118 1517  420   32   39  201  350   89
 [37]   64  385  212    4   72  730  151    7 1159   65   36  333   97  306  531 1502   26   18
 [55]   67  329   75  532   64  427   39  352  283  483   19    9    2 1018  137  160  223   98
 [73]   15  182   98   41   25 1136  405  474 1025 1331  159   70   84  129  233    2   41   66
 [91]    1   23    8  325   10  455  363  351  108    3

如果性能成为一个问题,或许探索一些改进会很有趣,比如一次创建更多数字rnorm(),然后计算超过限制所需的数量,并在必要时重复。