我想要編寫一個小函數,我可以用它在R中的邏輯迴歸中進行自動特徵選擇,方法是以蠻力方式測試預測變量的所有子集,然後通過CV他們的分類表現。計算R中一個向量的所有子集
令人驚訝的是,我沒有找到一個這樣做「所有子集特徵選擇」的包,因此我想自己實現它。
不幸的是我有限的知識 - [R使我不能寫一個循環,產生一個給定的矢量的所有子集,我想知道,如果有人可以點我在正確的方向
我想要編寫一個小函數,我可以用它在R中的邏輯迴歸中進行自動特徵選擇,方法是以蠻力方式測試預測變量的所有子集,然後通過CV他們的分類表現。計算R中一個向量的所有子集
令人驚訝的是,我沒有找到一個這樣做「所有子集特徵選擇」的包,因此我想自己實現它。
不幸的是我有限的知識 - [R使我不能寫一個循環,產生一個給定的矢量的所有子集,我想知道,如果有人可以點我在正確的方向
買者incernor
的bestglm
package是你所追求的
功能bestglm選擇爲GLM家庭投入的最好的子集。可用的選擇方法包括各種信息標準以及交叉驗證
小插曲經過了許多例子。
library(bestglm)
data(SAHeart)
# using Cross valiation for selection
out<-bestglm(SAheart,IC = 'CV', family=binomial, t = 10)
out
# CVd(d = 373, REP = 10)
# BICq equivalent for q in (0.190525988534159, 0.901583162187443)
# Best Model:
# Estimate Std. Error z value Pr(>|z|)
# (Intercept) -6.44644451 0.92087165 -7.000372 2.552830e-12
# tobacco 0.08037533 0.02587968 3.105731 1.898095e-03
# ldl 0.16199164 0.05496893 2.946967 3.209074e-03
# famhistPresent 0.90817526 0.22575844 4.022774 5.751659e-05
# typea 0.03711521 0.01216676 3.050542 2.284290e-03
# age 0.05046038 0.01020606 4.944159 7.647325e-07
會不會drop1()
和add1()
是有幫助你的目的?他們通常會提醒您,自動功能選擇並不總是最合適的,但我認爲您已經做出了明智的選擇。
您可以使用paste()
+ combn()
,例如,
varnames <- c("a","b","c")
rhs <- unlist(sapply(1:length(varnames),function(k) apply(combn(varnames,k),2,paste,collapse=" + ")))
formulae <- as.formula(quote(paste("z ~", rhs)))
...但也許有更優雅的方式?
哦這簡化了事情,非常感謝你:) – user695652