循环内的岭回归

Ridge regression within a loop

我是编码方面的新手,所以我仍然在处理简单的事情,例如循环、子集以及数据帧与矩阵。

我正在尝试为第一个图像中显示的多变量 X(X1=标记 1,X2= 标记,X3= 标记 3,...,X1333= 标记 1333)拟合岭回归,作为Y 的预测变量,在第二张图片中。

我想计算不同调整参数 λ(在 1 到 20 之间)的误差平方和 (SSE)。我的代码如下:

#install.packages("MASS")
library(MASS)


fitridge <- function(x,y){
  fridge=lm.ridge (y ~ x, lambda = seq(0, 20, 2)) #Fitting a ridge regression for varying λ values
  sum(residuals(fridge)^2) #This results in SSE
}

all_gcv= apply(as.matrix(genmark_new),2,fitridge,y=as.matrix(coleslev_new)) 
}

然而,它returns这个错误,我不知道该怎么办了。我试过将数据集转换成矩阵,数据框,改变行和列的顺序...

Error in colMeans(X[, -Inter]) : 'x' must be an array of at least two dimensions.

我只想从单行(第一张图片)中获取每个标记值,将它们传递到我的 fitridge 函数中,该函数针对第二个数据集(在第二张图)。 然后对 SSE 及其相应的 lambda 值进行子集

您不能只用一个自变量拟合脊线。这不是为了这个。在您的情况下,您很可能必须这样做:

genmark_new = data.frame(matrix(sample(0:1,1333*100,replace=TRUE),ncol=1333))
colnames(genmark_new) = paste0("Marker_",1:ncol(genmark_new))
coleslev_new = data.frame(NormalizedCholesterol=rnorm(100))
Y = coleslev_new$NormalizedCholesterol

library(MASS)
fit = lm.ridge (y ~ ., data=data.frame(genmark_new,y=Y),lambda = seq(0, 20, 2)) 

并计算每个 lambda 的残差:

apply(fit$coef,2,function(i)sum((Y-as.matrix(genmark_new) %*% i)^2))
       0        2        4        6        8       10       12       14 
26.41866 27.88029 27.96360 28.04675 28.12975 28.21260 28.29530 28.37785 
      16       18       20 
28.46025 28.54250 28.62459

如果需要分别对每个变量进行拟合,可以考虑使用线性模型:

fitlm <- function(x,y){
  fridge=lm(y ~ x) 
  sum(residuals(fridge)^2)
}

all_gcv= apply(genmark_new,2,fitlm,y=Y)

建议,查看make notes or introductions to ridge,它们用于多变量回归,即多于 1 个自变量。