【问题标题】:Ridge regression within a loop循环内的岭回归
【发布时间】:2020-09-21 21:27:51
【问题描述】:

我是编码新手,所以我仍然在处理循环、子集和数据框与矩阵等简单的事情。

我正在尝试为多变量 X(X1=Marker 1,X2=Marker,X3=Marker 3,...,X1333=Marker 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)) 
}

但是,它返回此错误,我不知道该怎么办了。我试过将数据集转换成矩阵、数据框、改变行列顺序……

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

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

【问题讨论】:

  • 你需要提供一个 ridge 的公式.. 在我写东西之前.. 你确定这是你想要做的吗?你是带有 1 个变量的岭回归,这根本没有意义
  • sthda.com/english/articles/37-model-selection-essentials-in-r/…,当你有很多变量并想要惩罚它们时,你会使用 ridge、lasso 等。在这种情况下你只有一个????
  • 再次感谢您的帮助!是的,所以许多变量将是来自“genmark_new”数据集(第一个图像)的每个基因标记,作为“coleslev_new”数据集(第二个图像)中每一行的预测因子。例如,将“genmark_new”中 F_1 行的每一列作为“coleslev_new”中 F_1 行的预测变量
  • 嗨@ValentinaGrilloAlvarado,好的,是的,所以你有胆固醇作为表型或反应,你想找到与它最相关的标记。如果您使用 ridge,您可以一次性安装所有内容。如果你想一次做一个变量,你可以使用一个简单的线性模型。
  • 我的观点是,只有当你有很多自变量时,lambda 才有意义。不是当你只有 1 个时

标签: r statistics statsmodels


【解决方案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)) 

并计算每个 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个自变量。

【讨论】:

    猜你喜欢
    • 2012-10-07
    • 2016-10-21
    • 2018-11-17
    • 2022-01-20
    • 2016-06-28
    • 2019-07-13
    • 2014-06-17
    • 2019-10-11
    • 2016-06-22
    相关资源
    最近更新 更多