初投稿です。プログラムと統計を趣味で始めた初心者です。
Rでは、lm関数やglm関数で簡単に重回帰分析ができますが、未知データの予測性能を上げるにはテクニックが必要らしいです。
未知データの予測性能を上げるため、正則化回帰を行うElastic Netがあります。
glmnetパッケージはElastic Netが計算できますが、formulaで入力できず、説明変数をmatrixで入力する必要があります。
また、Elastic Netはチューニングパラメータとして、αとλがあります。
λはcv.glmnet関数でクロスバリデーションできますが、αのチューニングは自動化されてません。
そこで、Elastic Netをglm関数のようにformulaで入力し、なおかつパラメータを自動でチューニングする関数を作りました。
まず、glmnetをインストールします。
install.packages("glmnet")
library(glmnet)
インストールできたら、以下をRのコンソールにコピー&ペーストします。
elasticnet <- function(
formula, family="gaussian",
data=NULL, offset=NULL, by=0.05, nfolds=10, seed=0
){
x <- model.matrix(formula,data=data)
y <- model.frame(formula,data=data)[,1]
df <- data.frame()
for(a in seq(0,1,by=by)){
set.seed(seed)
df <- rbind(df,
data.frame(alpha=a,
cvm=min(
cv.glmnet(x=x,y=y,offset=offset,
family=family,nfolds=nfolds,alpha=a)$cvm
)))
}
result <- cv.glmnet(x=x,y=y,offset=offset,family=family,nfolds=nfolds,
alpha=df[which.min(df[,2]),1])
result$formula <- formula
result$alpha_cvm <- df
return(result)
}
predict.en <- function(result,data){
x <- model.matrix(result$formula,data=data)
predict(result,x)
}
irisの場合、以下でモデル作成できます。
result <- elasticnet(Sepal.Length~Sepal.Width+Petal.Length,data=iris)
glm関数のように、familyやoffsetが使用できます。
byでαを探すステップ、nfoldsでクロスバリデーションの分割数、seedで乱数種を設定できます。
予測は、predict関数のように以下で行えます。
result <- predict.en(result,data=iris)
係数はcoef関数で計算できます。
coef(result)
なお、上記関数は大規模な計算には不向きです。