使用rnorm连续创建数据,直到R中出现异常值

使用rnorm连续创建数据,直到R中出现异常值,r,while-loop,repeat,R,While Loop,Repeat,很抱歉标题混淆,但我不确定如何命名我正在尝试做的事情。我的目标是创建一个1000个OB的数据集,每个OB都是运行的长度。我创建了一个phase1数据集,从中生成一组控制限制。我现在要做的是创建一个最有可能使用rnorm的phase2数据集。我试图做的是创建一个重复循环,该循环将在phase2数据集中连续创建值,直到其中一个值超出phase1数据集生成的控制限制。例如,如果我将3.0和-3.0作为控制限值,则phase2数据集将创建一组观测值,直到obs 398,此时此处的值恰好为3.45,从而停

很抱歉标题混淆,但我不确定如何命名我正在尝试做的事情。我的目标是创建一个1000个OB的数据集,每个OB都是运行的长度。我创建了一个phase1数据集,从中生成一组控制限制。我现在要做的是创建一个最有可能使用rnorm的phase2数据集。我试图做的是创建一个重复循环,该循环将在phase2数据集中连续创建值,直到其中一个值超出phase1数据集生成的控制限制。例如,如果我将3.0和-3.0作为控制限值,则phase2数据集将创建一组观测值,直到obs 398,此时此处的值恰好为3.45,从而停止创建数据。我的目标是记录数字398。此外,我尝试将代码循环回phase1数据集/控制限制部分,创建一组新的控制限制,然后运行另一个phase2,直到记录了1000个运行长度。我为phase1/控制限值编写的代码运行良好,如下所示:

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) 
nphase1=50
nphase2=1000
varcount=1
meanshift=0
sigmashift=1
#####第1阶段数据集/控制限值#####

第1阶段使用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
})

如果性能出现问题,探索一些改进可能会很有趣,比如一次使用
rnorm()
创建更多的数字,然后计算需要多少数字才能超过限制,并在必要时重复。

这就是我一直在尝试做的,谢谢。快速跟进,为了保存这些结果的数据帧,我可以添加类似DF_ARLYes的内容,尽管我不明白为什么您会将其保存为一列data.frame。当然,如果您还有其他列要添加,您可以在之后从它创建一个数据帧。我可能不完全理解,但是
while
循环似乎效率非常低。可能需要数千次抽签才能找到超出限制的东西。相反,你应该在
[0,F^-1(下限)]U[F^-1(上限),1]
上画一个变量统一,其中
F
是标准的正常CDF(例如,将一个U(0,1)图乘以
F^-1(下限)+1-F^-1(上限)
。@MichaelChirico我同意
,但
可能效率很低,特别是如果限值更改为更大的范围(尽管在某些情况下,如果不调整
rnorm
的平均值和sd,则不可能)。也许你可以发布你的解决方案?我很想看到聪明的数学方法来做这件事。@MichaelChirico你真的不应该在别人的答案中编辑代码。如果您觉得需要解决某些问题,您可以在评论中这样做,但您的编辑不应获得批准。
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