我正在尝试在LASSO回归中引导lambda1参数(库惩罚)(不是系数估计,因为我知道计算例如它们的95%CI是没有意义的,这只是关于lambda1的问题)。 这是我到目前为止的地方:
df <- read.table(header=T, text="group class v1 v2
1 Ala 1 3.98 23.2
2 Ala 2 5.37 18.5
3 C 1 4.73 22.1
4 B 1 4.17 22.3
5 C 2 4.47 22.4
")
试过这个:
X<-df[,c(3,4)] # data, variables in columns, cases in rows
Y<-df[,2] # dichotomous response
for (i 1:100) {
opt1<-optL1(Y,X)
opt1$lambda
}
但得到错误:意外&#34;}&#34;在&#34;}&#34;
试过这个:
f<-function(X,Y,i){
opt1<-optL1(Y,X,[i])
}
boot(X,f,100)
但是在启动时出现错误(X,f,100):矩阵上的下标数量不正确...有人可以帮忙吗?
答案 0 :(得分:1)
以下是for循环的错误:
1)它需要(i in 1:100){}的语法才能工作;
2)它需要在适当的对象中保存opt1 $ lambda;
3)它很可能需要值(Y,X)从循环的一次迭代变为另一次循环。
上述项目1)和2)的R代码可以写成如下:
lambda <- NULL
for (i in 1:100) {
opt1 <- optL1(Y,X) # opt1 will NOT change
# since Y and X are the SAME
# over each iteration of the for loop
lambda <- c(lambda, opt1$lambda)
}
lambda
在此代码中,将使用命令lambda - &gt;在for循环的顶部声明将存储在每次迭代时生成的值opt1 $ lambda的对象lambda。 NULL然后在每次迭代后使用该命令进行扩充 lambda&lt; - c(lambda,opt1 $ lambda)。
通常,建议不要对大量迭代使用NULL技巧。更好的选择是:
lambda <- list('vector', 100)
for (i in 1:100) {
opt1 <- optL1(Y,X) # opt1 will NOT change
# since Y and X are the SAME
# over each iteration of the for loop
lambda[i] <- opt1$lambda
}
lambda <- unlist(lambda)
lambda
使用第二种方法,我们在for循环的顶部预先分配lambda为一个包含100个组件的列表,这样第i个组件将存储在第i次迭代期间产生的值opt1 $ lambda。在for循环中,我们使用以下命令将opt1 $ lambda的值保存在名为lambda的列表中:
lambda[i] <- opt1$lambda.
在循环结束时,我们取消lambda,使其成为常规向量(即数字列)。
答案 1 :(得分:0)
您可以更改函数以接收data.frame,并在optL1
中指定用于响应和协变量的列:
library(boot)
library(penalized)
f<-function(data,ind){
fit = optL1(data[ind,"class"],data[ind,c("v1","v2")])
fit$lambda
}
df = data.frame(group=sample(c("A","B","C"),100,replace=TRUE),
class=sample(2,100,replace=TRUE),
v1 = rnorm(100),
v2 = rnorm(100)
)
bo = boot(df,f,100)
o
ORDINARY NONPARAMETRIC BOOTSTRAP
Call:
boot(data = df, statistic = f, R = 100)
Bootstrap Statistics :
original bias std. error
t1* 2.887399 0.2768409 1.85466