2016-06-24 37 views
0

我正在按年份,主題和等級檢查測試分數的分佈情況。我想確保沒有任何異常值,這與異常值的偏差超過4個標準偏差。這是我的代碼:如何使用標量檢查異常值

bys year subject tested_grade: summarize test_score 

但是,當我試圖讓我的標量只能得到相當於去年同期的標量,主題,tested_grade。我試過創建一個循環,但它導致了同樣的問題。

我發現尼克考克斯的extremes命令,但它並沒有告訴我有多少標準偏差的極端值是從平均值。

如果任何人有一些關於如何檢查異常值的想法,如通過遠離平均值的標準偏差測量來確定,那將是非常有用的。

編輯

此代碼讓我(主要是)我想要的東西。

bys year subject tested_grade: summarize test_score 
gen std_test_score = (test_score > 4*r(sd)) if test_score < . 
list test_score std_test_score if std_test_score==1 

唯一的問題是,最後一年,主題和testing_grade是r(sd)的來源。我想創建一個變量 - std_test_score1-20 - 每年,subject和tested_grade。

+2

「我發現尼克考克斯的」極端「命令,但它並沒有告訴我有多少標準偏差的極端值與平均值不符。」 **的目的**:一旦你有可能的異常值,標準偏差和均值本身就會受到影響,而(值 - 平均值)/標準偏差不是異常值的度量標準! –

+0

也許我應該添加,但是我將數據與數據提供者發佈的平均值max,min和std進行了比較。我的意思是,max等應該與他們匹配,因爲我的手段有點不同,所以我想看看是否有一些異常值可能會導致這種差異。 – otteheng

+0

沒有什麼能阻止你計算(價值 - 平均數)/標準差。如何做到這一點取決於數據中的手段和可持續發展標準是如何保存的,或者根據您的數據進行計算。 –

回答

2

手段和SDS可以在一次幾組由

bysort year subject tested_grade : egen mean_test_score = mean(test_score) 
by year subject tested_grade: egen sd_test_score = sd(test_score) 
gen std_test_score = (test_score - mean_test_score)/sd_test_score 

確實產生,egen具有功能std()一步到位做到這一點,但它往往是一個好主意,從甚至重新創建基礎更基本的原則。

您的代碼省略了平均值的減法。

然而,正如評論中所強調的那樣,(值 - 均值)/ SD對於異常值來說是一個糟糕的標準,因爲異常值本身會影響均值和標準差。這就是爲什麼,例如,箱形圖是基於中位數,四分位數和(通常)分數超過距離較近四分位數的四分位距離。