大數據/由於零方差而自動列消除你好
我正在分析一個非常大的數據集,列中至少有大約 2000 個參數。 我的示例具有約 250k 行的這些參數值。 我的問題是列,而不是行。
我為所有樣本定義了一個離散分類,兩個離散值,例如 A 類和 B 類。
我正在另一個軟件中進一步分析數據,如果它檢測到方差為零(或非常接近)的參數,則該軟件會失敗。
我不想手動完成這項工作(正如你可以從 2000 列中想像到的那樣)。
我正在尋找一種盡可能自動化的方法來刪除 A 類或 B 類方差為零(或低於定義的非常小的閾值)的列。 我按照步驟完成工作,但我不想手動選擇任何列來進行刪除。
任何幫助將不勝感激。提前致謝。
回复:大數據/由於零方差而自動列消除布雷迪,
下面的腳本對您的腳本進行了輕微修改,應該作為起點。(對 stdev 進行一些細微修改,與閾值進行比較)。 如您所知,我需要一個實際的腳本來進一步進行,因為此刪除將由腳本自動完成。 JMP 數據選擇之後的下一階段內部代碼在遇到零方差時尤其會出現問題。 您之前的版本(即下面)證明這些可以被刪除。我雖然試圖避免刪除帶有均值差異但方差為零的參數。
我無法使用依賴於實際參數平均值和分佈的閾值。例如 我無法指定實際差異,因為這需要深入檢查所有 2000 個參數,不可行。 不確定我是否提到過,但 2000 年只是冰山一角,更多的還在後面。 然而,單個數據集包含大約 2000 個參數。
我可以使用 p_value 來過濾傳入或傳出的參數,具體取決於哪些參數會導致我們的內部代碼失敗。 我認為從這個角度來看,t 檢驗可能是一個更好的選擇。 但是,我不知道如何插入 t 檢驗並提取 p_value ....所以我可以將其添加為附加過濾器。
我感覺我有兩個選擇...
1)我要么按原樣使用下面的代碼,而不進行進一步的 2 個樣本均值比較。 即使平均值不同,它也會刪除所有此類情況。 然後,我需要記錄那些被刪除的列名稱(需要幫助),以便在整個研究結束時,我可以將注意力轉向它們並在 jmp 中分析它們以檢測均值差異(如果有)。 從百分比來看,這將是一個小得多的參數分析集,我預計零方差情況將是數據集的很小一部分。
2)或者我的第二個選擇是添加 t 檢驗或任何其他提供標準化閾值的檢驗,以微調顯著差異的總體。 例如。 我可以使用 p_value 來確認或拒絕顯著性。
你怎麼認為 ?
謝謝
-------------------------------------------------- -------------------------------------------------- -------------
名稱默認為此處( 1 );
dt = 當前數據表();
dtcol1 = 列(dt, 1);
dt1 = dt << 子集(行(dt<<獲取行其中(ascolumn(dtcol1) == dtcol1[1])), 不可見, 選定的列(0));
dt2 = dt << 子集(行(dt<<獲取行其中(ascolumn(dtcol1) != dtcol1[1])), 不可見, 選定的列(0));
// 獲取所有連續數據列
colList = dt << 獲取列名(數字,連續);
// 遍歷所有列並找到沒有方差的列
For( i = N Items( collist ), i >= 1, i--,
If( (列標準差( 列( dt1, colList[i] ) ) ) >= 0.01 & 列標準差( 列( dt2, colList[i] ) ) >= 0.01,
colList = 刪除( colList, i, 1 )
)
);
// 刪除沒有方差的列
dt<<刪除列(colList);
關閉(dt1,nosave);
關閉(dt2,nosave);
注意:stdev 的閾值尚未確定。 0.01 只是一個例子。 會對此進行微調。
回复:大數據/由於零方差而自動列消除<<經過編輯以反映有 ~250,000 行,而不是 ~2,000,這是列數。>>
Altug,有件事我想澄清一下:你有大約 25 萬行數據,分為兩組,我假設(默認情況下)它們的大小大致相同。 如果是這樣,則每組包含 125,000 個樣本的 t 檢驗的功效 = 0.9,可檢測到小於 1/50 西格瑪的差異。 鑑於您只有在一個或兩個西格瑪水平非常低時才達到這一點(測試手段),那麼您認為如此小的(相對於西格瑪)差異是否具有實際重要性? 即,如果您有 2 個進程,且 sigma 大致 = 1 個單位,那麼 0.018 個單位的均值差異對您來說重要嗎? 這就是當每組中有 125,000 個項目時 t 檢驗的敏感度。
如果在您的設置中,如此小的差異並不重要,那麼您最好使用等價檢驗(最簡單的形式 2,同時,單邊 t 檢驗),它允許您指定差異有多大是有意義的。 差異小於該量的手段被認為實際上是等效的。 使用這種方法,只要平均值實際上相等並且至少有一個組標準差低於閾值,就可以刪除給定的列。
這是一些信息和示例:
http://www.jmp.com/support/help/Equivalence_Test.shtml
回复:大數據/由於零方差而自動列消除謝謝杜安。
我試圖通過特定的輸出和比較來確定腳本中的參數是否與 A 類和 B 類不同。 我並不是試圖分析中間結果表然後做出決定。
我在給定數據集中有 2000 個參數列以及許多大小相當的數據集。
對於給定參數,該過程需要自動刪除在兩個類 A 和 B 之間發現幾乎相同的相關列。
我最初將其寫為零方差尋求邏輯,但問題是兩個具有零方差但具有不同平均值的參數不應被刪除。 從那時起,我開始更改邏輯以包含用於比較 2 個樣本均值檢驗的檢驗。
我的問題是我在腳本編寫方面非常新手,不知道如何從給定平台的結果中調用參數。
我的數據中的另一個問題是您在腳本中指定了所有參數,這樣做甚至可能被證明非常耗時(也許有一個足夠簡單的方法)。
Brady 的腳本實際上近乎完美,只是我需要添加 2 個樣本的均值測試,並了解如何使用其輸出作為附加過濾器。
感謝您的幫助。
回复:大數據/由於零方差而自動列消除精確的測試可能需要很長時間才能計算,並且考慮到數據表中有 250,000 行,我敢打賭在這種情況下它們不會被計算。我建議改為使用
Summarize YByX()
命令計算所有 Fit Y By X 組合,並為每個 y/x 組合生成 p 值和 LogWorth 值的數據表。然後您可以確定正確的列以進一步調查。您需要在單獨的步驟中測試零方差。
回复:大數據/由於零方差而自動列消除布雷迪
我在一個示例數據集(還不是很大的數據集)上對此進行了測試,以了解其中的機制。 我已經能夠修改它以在聖上設置閾值。開發人員。而不是要求0。 我剩下的問題是,我不想在以下情況下刪除數據
stdev<=閾值(即接近0)和數據平均值(A類和B類的參數)是不同的。
因此,我需要添加一個測試來比較 A 和 B 的平均值,作為進一步的附加約束。
我正在考慮 Kolmogorov-Smirnov 測試...在這種情況下我可以簡單地聲明“如果 KS <= thrreshold(實際上接近 0)則刪除參數”
事實上,我想做的是向下選擇下一步不同的參數。 所以我開始想也許最好的辦法就是應用 KS(不需要 stdev)。
JMP 幫助提供
名稱默認為此處( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
obj = Oneway( Y( : 身高 ), X( : 性別 ) );
obj << 柯爾莫哥洛夫·斯米爾諾夫精確檢驗( 1 );
這可以翻譯成我的情況嗎(在當前循環內)
obj=Oneway( Y(:Column( dt1, colList[i] ), X( Column( dt2, colList[i] ) ) );
obj << 柯爾莫哥洛夫·斯米爾諾夫精確檢驗( 1 );
但我不知道如何從這個 obj 對像中提取 KS 值。
順便說一句,我認為 2000 列的 cpu 時間不會困擾我,因為我願意採取任何措施來避免對數據進行任何手動操作。
非常感謝。
回复:大數據/由於零方差而自動列消除吉姆,
在此感謝您的指導。 我會嘗試一下。再次感謝。
回复:大數據/由於零方差而自動列消除你的理解是正確的,布雷迪。唯一要強調的是,有 250,000 行,這變成了 2000 x 250,000 的矩陣。
回复:大數據/由於零方差而自動列消除由於選擇反轉與兩次選擇,這個塊與前一個塊相比又花了十分之一秒。 在更大的桌子上獲得更大的收益。
dtcol1 = column(dt, 1);
dt << select where(ascolumn(dtcol1) == dtcol1[1]);
dt1 = dt << subset(selected rows(1), invisible, selected columns(0));
dt << Invert Row Selection;
dt2 = dt << subset(selected rows(1), invisible, selected columns(0));
回复:大數據/由於零方差而自動列消除Altug,我已經測試了我的代碼,雖然它避免了顯式循環,這很好,但是當表變大時, << get all value as matrix () 函數實在太昂貴了,而且收益(如果有的話) vstd() 與表操作相比,太小了,無法抵消這一點。
對於您的大小的桌子,修改吉姆的代碼(以允許您的組)將會更快。 其核心是 JMP 表操作非常快。 我什至不相信矩陣運算(也非常快)比列函數更快。
最初對錶進行子集化以創建兩個子表(每個組一個),這超出了其本身的成本(假設您有足夠的內存來容納所有3 個表),因為反复獲取行子集的成本很高。
下面的代碼(再次對Jim 的代碼進行了輕微修改,以允許您的兩個組)在大約2.5 秒內運行了100K 行和1K 列,而我第一次提交的例程花費了6 秒多的時間。
在你這麼大的桌子上,這看起來仍然有點慢……希望其他人會有更好的主意。
Names Default To Here( 1 );
dt = current datatable();
dtcol1 = column(dt, 1);
dt1 = dt << subset(rows(dt<<GET rows="" where="">= 1, i--,
If( (Col Std Dev( Column( dt1, colList[i] ) ) ) != 0 & Col Std Dev( Column( dt2, colList[i] ) ) != 0,
colList = Remove( colList, i, 1 )
)
);
// Delete the columns with no variance
dt<<DELETE columns=""></DELETE></GET>
回复:大數據/由於零方差而自動列消除阿爾圖格,
如果我正確理解你的問題:
- 您有一個列(例如,名為“組”),有 2 個值(例如“A”和“B”)。
- 您有 2000 列包含數字數據。
- 您希望刪除屬於“A”組的行的標準偏差或屬於“B”組的行的標準偏差低於某個閾值(或兩者)的任何列。
對於您的大小的表來說,性能(和內存使用)將成為一個問題。 我不確定下面的方法是否能在您擁有的大小的桌子上工作或快速工作,但請嘗試一下。
首先,創建一個表,其中“a/b”列是第一列,其餘列是感興趣的參數列。
然後試試這個。<BR />
乾杯,
布雷迪
dt = Current Data Table();
mat = dt << Get All Columns As Matrix(); //this get the A/B column as 1s and 2s. which is which not important.
//create subtables... note A & B will be reversed if B occurs first in dt; the result is unaffected.
matA = mat[loc(mat[0,1]==1), 0];
matB = mat[loc(mat[0,1]==2), 0];
//compute stddevs for each column in each subtable
stdvA = vstd(matA);
stdvB = vstd(matB);
//locate columns of sufficiently low variance
cols = loc(stdvA == 0 | stdvB == 0);
//delete them. Ignore row (1) of the cols vector; it is 1 (corresponding to column 1 in dt).
try(dt << delete columns((dt << get column names)[cols[2::nrow(cols)]]));
回复:大數據/由於零方差而自動列消除這是一個簡單的示例腳本,可以完成您想要的操作。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA\semiconductor capability.jmp" );
// Get all continuous data columns
colList = dt << get column names( numeric, continuous );
// Loop across all columns and find those with no variance
For( i = N Items( collist ), i >= 1, i--,
If( Col Std Dev( Column( dt, colList[i] ) ) != 0,
colList = Remove( colList, i, 1 )
)
);
// Delete the columns with no variance
dt<<DELETE columns=""></DELETE>