我有一个包含9000个观测值和13个解释变量的数据集。 其中一些是类别变量,因此我将它们转换为虚拟变量,并且由于是基本类别,因此始终将类别设置为NULL。现在我已经准备好53个实验变量。我想进行一次岭回归,以得出最佳的模型以进行样本预测。为此,我想使用glmnet软件包。在13个解释变量中,我想创建2-10级的多项式,并建立所有可能的正态变量以及所有政治变量的交互项,此外,我还希望获得多项式到交互项2-10的多项式
我的问题是glmnet包仅使用矩阵或数据帧作为参数,因此我不能使用公式。如果我尝试使用所有这些变量生成一个数据框,那么我的数据框中就会有曼迪·科鲁姆的话,那我就关机了。
我该怎么解决这个问题?
答案 0 :(得分:0)
您可以使用model.matrix
进行指定。这是使用iris
数据的示例
首先,我将创建一个具有某些级别的虚拟因子列:
df <- iris
df$factor <- as.factor(sample(1:2, nrow(iris), replace = TRUE))
head(df)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species factor
1 5.1 3.5 1.4 0.2 setosa 1
2 4.9 3.0 1.4 0.2 setosa 1
3 4.7 3.2 1.3 0.2 setosa 1
4 4.6 3.1 1.5 0.2 setosa 2
5 5.0 3.6 1.4 0.2 setosa 2
6 5.4 3.9 1.7 0.4 setosa 2
现在制作模型矩阵
x <- model.matrix(Species ~ poly(Sepal.Length, 10)*factor-1, #-1 means no intercept
data = df)
ncol(x) #output is 22, do head(x) to see what the columns are
基本上,对于Sepal,Length与第一级交互有10列poly;对于Sepal.Length与第二级交互交互,有10列poly +与因子变量相对应的两个单列。
现在使用cv查找最佳的lambda:
model <- cv.glmnet(y = iris$Species,
x = x,
alpha = 0,
family = "multinomial",
lambda.min.ratio = 1e-6) #changed it from the default since it looked the optimum is lower then the min lambda tried
plot(model)
答案 1 :(得分:0)
这不是一个完整的答案-解释了为什么如此困难的原因-但绝对无法发表评论。
首先,套索/岭/弹性网方法从根本上建立在对模型矩阵的操作上(即每个观测值一行,每个 predictor 变量,即从输入变量),因此实际上在某种程度上无法构建模型矩阵(尽管您可以分段完成,请参见下文)。
稀疏模型矩阵模型将有助于构建主要涉及因素的模型矩阵(这些因子会转换为指标或虚拟变量),但我认为这不会给您太大帮助。
此math overflow question解释了n
变量的阶数k
的多项式需要choose(n+k,k)
派生变量(用R表示:这是二项式系数,给出了可能样本的数量k
个对象中n+k
的大小)。构造一个报告模型矩阵的列数,如果有r
行的情况下元素总数以及模型矩阵的总大小(以Mb为单位)的函数:
calc_size <- function(deg,nvars,r=9000) {
cc <- choose(deg+nvars,nvars)
return(c(cc,cc*r,cc*r*8/2^20))
}
calc_size(10,13,r=9000)
告诉您您需要1.14个百万列,10.2个 billion 条目以及77 Gb的空间来存储此问题的模型矩阵。无需担心扩展分类变量还需要多少空间。如果您真的想处理53个全数字列至第10位,则需要1.27 * 10 ^ 11列和PB级的存储空间。 (对于稀疏模型矩阵较少,但是将稀疏(虚拟变量)和非稀疏列组合在一起可能会很棘手...)
如果您确实要执行此操作,则可以使用biglasso软件包。 vignette给出了从文件支持的31 G数据集中拟合n = 2898,p = 1,339,511的数据集的示例。这比您预期的要小,但是至少是相同的数量级(4个核的拟合大约需要51分钟...)如果这样做,我首先会构建模型矩阵(可能分成小块) (例如一次500或1000行),然后将块存储/连接到磁盘上的数据文件中,然后使用biglasso
来拟合模型。
但是,取决于您可用的硬件和技术专家的水平,您可能不得不缩减目标(对C(10,53)列施加强力是不太可能的。)