簡體   English   中英

如何通過 output 中的特征選擇方法計算正確選擇的模型的數量,其結構為 R 中的列表或 df

[英]How to count the # of correctly selected models by a feature selection method in its output structured as a list or df in R

我已經在 58,000 個(csv 格式)隨機生成的合成數據集(所有相同大小)的同一文件夾上運行了機器/統計學習中的幾種最佳變量/模型選擇方法,以便比較哪種方法正確選擇了真正的底層 model每個數據集的次數最多。 所有腳本和許多數據集都可以在我的GitHub 存儲庫中找到,用於該研究項目。

我已經得到了我需要的輸出/結果,每個文件格式化數據集的名稱都以下列方式格式化:n1-n2-n3-n4 其中 n1 開始於 0 並結束於 1,n2 開始於 3 並結束於15,n3以1開頭,以9結尾,n4以1開頭,以500結尾。帶有結果的數據幀/列表如下所示:

> str(BM1_models)
'data.frame':   58000 obs. of  1 variable:
 $ V1: chr  "0-3-1-1;  X1, X2, X3" "0-3-1-2;  X1, X2, X3" "0-3-1-3;  X1, X2, X3" "0-3-1-`4;  X1, X2, X3" ...`

> head(BM1_models, n = 4)
                    V1
1 0-3-1-1;  X1, X2, X3
2 0-3-1-2;  X1, X2, X3
3 0-3-1-3;  X1, X2, X3
4 0-3-1-4;  X1, X2, X3

> tail(BM1_models, n = 4)
                                                           V1
57997         1-15-9-497;  X2, X3, X4, X9, X10, X11, X13, X14
57998 1-15-9-498;  X2, X3, X5, X6, X8, X9, X10, X11, X12, X15
57999     1-15-9-499;  X3, X4, X5, X6, X8, X10, X11, X12, X15
58000               1-15-9-500;  X2, X4, X6, X7, X8, X10, X11

如何判斷 ML 變量/因子選擇方法(在本例中為 LASSO)是否適用於任何給定數據集,如果該數據集的 n2 為 3,則選擇的自變量應為 X1、X2、X3,如果它顯示為 4 ,底層結構 model 是 X1、X2、X3、X4 等直到 15(我將在底部的 ps 部分解釋 n1、n3 和 n4 的含義)。 所以,如果 function 里面的所有內容都在一個簡單的 function 中,我需要在復雜的情況下編寫類似計數 function 之類的東西,但我不知道具體怎么做。

ps Part1 數據集和腳本也可以在我的這個GitHub 存儲庫中找到,它應該比我鏈接到的第一個更容易導航。

ps Part2 澄清一下,如果給定數據集的 n2 = 5 並且選擇的 model 是 X1、X2、X4、X5(稱為省略變量 model 或 X1、X2、X3、X4、X5、X8、X9 等。稱為外變量模型),這是不正確的。只應計算包含所有變量 X1 到 Xn2 的 model,而不應計算其他所有結果。

ps Part3 n1 表示真實(基礎)結構回歸方程中因子之間的多重共線性量,n3 表示誤差方差,n4 表示其他 3 個參數的每組所有可能隨機生成的數據集中的 500 個隨機變化中的哪一個它是(這是蒙特卡洛模擬)。

如果我做對了,這個想法是檢查形式為'X1, X2, ..., Xn'的字符串的第二部分是否等於基於同一字符串的第一部分的預期值。 我認為最簡單的方法是編寫一個sapply對任何單個字符串進行比較,然后將其應用於字符串向量:

# testing df, only first (good) and last (bad) entry
df = data.frame(V1 = c('0-3-1-1; X1, X2, X3', '1-15-9-500; X2, X4, X6, X7, X8, X10, X11'))

good_model = function (str) {
  str  = unlist(strsplit(str, '; '))
  desc = str[1]
  pred = str[2]
  n_2  = unlist(strsplit(desc, '-'))[2]
  expt = paste0('X', 1:as.integer(n_2), collapse = ', ')
  identical(pred, expt)
}

df$good = sapply(df$V1, good_model)

df
#                                       V1  good
#                      0-3-1-1; X1, X2, X3  TRUE
# 1-15-9-500; X2, X4, X6, X7, X8, X10, X11 FALSE

注意:我假設了;之后的字符在原始字符串中是一個空格,如果它是一個<tab>那么第一次調用strsplit()應該被更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM