使用 rnorm 连续创建数据,直到 R 中出现异常值
Creating data continuously using rnorm until an outlier occurs in R
抱歉,标题令人困惑,但我不确定如何为我正在尝试做的事情命名。我的 objective 是创建一个包含 1000 个 obs 的数据集,每个都是 运行 的长度。我创建了一个 phase1 数据集,从中产生了一组控制限制。我现在要做的是创建一个最有可能使用 rnorm 的 phase2 数据集。我试图做的是创建一个重复循环,它将在 phase2 数据集中不断地创建值,直到其中一个值超出从 phase1 数据集产生的控制限制。例如,如果我有 3.0 和 -3.0 作为控制限制,phase2 数据集将创建一堆观察值,直到 obs 398,此时这里的值恰好是 3.45,从而停止创建数据。我的 objective 然后记录数字 398。此外,我然后尝试将代码循环回 phase1 数据集/控制限制部分并创建一组新的控制限制,然后 运行 另一个 phase2 ,直到我记录了 1000 运行 个长度。我为阶段 1/控制限制编写的代码工作正常,看起来像这样:
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 循环代替 repeat 循环。
我是 R 的新手,所以非常感谢您提出的任何想法。谢谢!
使用 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()
创建更多数字,然后计算超出限制所需的数量并在必要时重复。
抱歉,标题令人困惑,但我不确定如何为我正在尝试做的事情命名。我的 objective 是创建一个包含 1000 个 obs 的数据集,每个都是 运行 的长度。我创建了一个 phase1 数据集,从中产生了一组控制限制。我现在要做的是创建一个最有可能使用 rnorm 的 phase2 数据集。我试图做的是创建一个重复循环,它将在 phase2 数据集中不断地创建值,直到其中一个值超出从 phase1 数据集产生的控制限制。例如,如果我有 3.0 和 -3.0 作为控制限制,phase2 数据集将创建一堆观察值,直到 obs 398,此时这里的值恰好是 3.45,从而停止创建数据。我的 objective 然后记录数字 398。此外,我然后尝试将代码循环回 phase1 数据集/控制限制部分并创建一组新的控制限制,然后 运行 另一个 phase2 ,直到我记录了 1000 运行 个长度。我为阶段 1/控制限制编写的代码工作正常,看起来像这样:
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 循环代替 repeat 循环。 我是 R 的新手,所以非常感谢您提出的任何想法。谢谢!
使用 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()
创建更多数字,然后计算超出限制所需的数量并在必要时重复。