2014-08-30 116 views
0

我想找到极值(任何高于或与平均不到三倍标准差)使用产生一个随机数集后发现极端值:在正态分布

num = rnorm(1000) 

我的代码看起来像如下:

extreme = function(varname) { 
    for(i in varname) { 
    count = 0 
    m  = mean(varname) 
    sd = 3*sd(varname) 
    if(i<(m-sd) || i>(m+sd)) { 
     count = count + 1 
    } 
    } 
    if(count>0) { 
    print(paste("There are ", count, " extreme values found.", sep = "")) 
    } else print("There are no extreme values.") 
} 

我总是得到“没有极端值”。我是R的初学者,那么在正态分布的随机生成的数字集合中真的没有极端值?

+0

你不需要循环。看看下面的内容:'length(num [abs(num)> 3])'。您也可以用样本标准偏差替换3:'num [abs(num)> 3 * sd(num)]'。 – COOLSerdash 2014-08-30 19:32:15

+1

这是一个编程问题,而不是统计问题,所以我们将它迁移到Stack Overflow。 FWIW,你的代码有错误if(i <(m-sd)...';记住'i'是一个*索引*,而不是被索引的*值* – gung 2014-08-30 19:33:50

+1

我认为这是一个统计新手,他没有意识到这不会造成离群值。我认为在编程问题背后是一个统计问题。 – EngrStudent 2014-08-31 00:57:26

回答

2

撇开编程问题,这个问题也带来了一个统计问题。

如果您的样本量很大,那么从您的值计算的样本SD将接近总体SD,并且询问平均值超过3SD的值可能是有意义的。

但是,如果您的样本很小,则任何异常值都会增加您计算的样本值SD。这意味着你可能永远不会达到3个SD。

将Z定义为enter image description here

具有N个观察值的样本,Z永远不会大于enter image description here 。因此n必须是11或更大,因为可能存在异常值超过均值3 SD以上的可能性。 格鲁布斯异常值测试基于这个想法,所以有自己的表格来表示从平均值中定义了多少个偏移值,以定义一个α值的异常值。

Grubbs,F.E. Procedures for detecting outlying observations in samples。 Technometrics 11,1-21(1969)。

0

您首先需要异常值。所有的测量都表现良好,并从相同的分布中正确地绘制。他们都是正常分配的合法孩子。离群值正在寻找突变/半身/外星人。你需要有一个外星人混合。为了讨论起见,我们可以说你正在测量芯片上的焊球的共面性(在混凝土中研究这个问题)。假设每个零件有1000个焊球。假设制造技术员将漏斗放入漏斗中,溢出了一些错误尺寸(太小),并且没有告诉任何人。可以说有10%的坏球。

这是什么意思,在物理上讲,是有两个集群。较小的球将具有更接近底物的中心位置,并且它们将具有较小的自然发生变化。可以说,POR(记录过程)焊球是12个+/- 1.2毫米的磨机,而错误尺寸的则是10个磨机+/- 1.0个磨机。你会模拟这是两个正常的组件。

N <- 1000 #solderballs 
n1 <- N *0.90 # good solderballs 
n2 <- N * 0.10 # bad solderballs 

mu1 <- -(12-10) *0.10 #weighted impact to the center of this cluster 
mu2 <- (12-10) *0.90 #weighted impact to the center of this cluster 

sig1 <- 1.2 
sig2 <- 1.0 

num = c(rnorm(n1,mean=mu1,sd=sig1),rnorm(n2,mean=mu2,sd=sig2)) 

Yay code。

你不想开始将它扔到你不确定的公式上。就像一个桶形信息公司一样,当你从过路人传给他们时,你想要在桶中保留尽可能多的水。将您的数据归入汇总统计表示您保留一个数字并丢失999.这可能是一个信息损失操作。

人类的大脑是已知最好的计算机。它使深蓝或天河看起来像算盘。首先使用它。让它看看你有什么。用最适合这项工作的工具打败你的数据。站在巨人的肩膀上。

我的建议:EDA(aka探索性数据分析)。美国国家标准与技术研究院NIST在这里制造了很好的工具。他们的爱因斯坦是聪明的,并且制作工具来使人们 - 你和我。区区凡人。所以这里是EDA链接。 http://www.itl.nist.gov/div898/handbook/eda/eda.htm

做一些情节。好的情节,告诉你关于你的数据。教科书是4情节。如果你不4绘制你的数据,那么你不知道它。直到你制作了一些人类可读和易理解的图表之前,不要创造一个方程式。它会保护你,使你的结果很好。

另外:我不认为有一个好的图书馆让R做这些情节,我希望有。这将是很好去“4plot(mydata)”,并得到4-plot.

因此,让我们做一个趋势图,滞后图,直方图和正常概率图。这些是将数据提供给大脑以进行培训的方法。

在这里,你可以让图形与此:

plot(num, type="l") 
lines(lowess(num,f=1/10),col="Red") 
lag.plot(num) 
hist(num,probability=TRUE, breaks=20) 
qqnorm(num) 
grid() 

鉴于问题的性质,JEDEC表示,“计算范围”或“计算从平均到尾部的最大距离”。这些是两种不同的指标,当您寻找“Tiffanies”时,他们开始能够检测出大约2.8到3.0标准偏差的异常值。如果你正在寻找1个异常值或100(甚至2),这是一个根本不同的命题。个人而言,对于“蒂凡尼问题”,我的指标可以在距均值1.55标准差处可靠触发。尽管如此,最好的开始是JEDEC及其2.8-3.0的检测开始。

祝你好运。