我是编码方面的新手,所以我仍然在处理诸如循环,子集和数据帧与矩阵之类的简单事情。
我正在尝试将多变量X(X1 =标记1,X2 =标记,X3 =标记3,...,X1333 =标记1333)的岭回归拟合为预测变量在第二张图片中。
我想计算变化的调整参数λ(介于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值子集化
答案 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,它们适用于多元回归,即,多个自变量。