循环内的岭回归

时间:2020-06-03 08:36:30

标签: r statistics statsmodels

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

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

enter image description here

enter image description here

我想计算变化的调整参数λ(介于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)) 
}

但是,它返回此错误,并且我不知道该怎么办了。我尝试将数据集转换为矩阵,数据框,更改行和列的顺序...

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

我只想从单个行(第一张图片)中获取每个标记值,并将它们传递到我的fitridge函数中,该函数针对第二个数据集(在第二张图片中)的Y拟合岭回归。 然后将SSE及其对应的Lambda值子集化

1 个答案:

答案 0 :(得分:1)

您不能仅使用一个自变量来拟合岭。这不是为了这个。就您而言,您很有可能必须这样做:

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)) 

并计算每个λ的残差:

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,它们适用于多元回归,即,多个自变量。