循环内的岭回归
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 个自变量。
我是编码方面的新手,所以我仍然在处理简单的事情,例如循环、子集以及数据帧与矩阵。
我正在尝试为第一个图像中显示的多变量 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 个自变量。