【问题标题】:Lasso r code - what is wrong with it?Lasso r 代码 - 它有什么问题?
【发布时间】:2012-12-21 13:40:04
【问题描述】:

我正在尝试使用 lars 包执行套索回归,但似乎无法让 lars 位工作。我输入了代码:

diabetes<-read.table("diabetes.txt", header=TRUE)
diabetes
library(lars)
diabetes.lasso = lars(diabetes$x, diabetes$y, type = "lasso")

但是,我收到以下错误消息: rep(1, n) 中的错误:'times' 参数无效。

我试过这样输入:

diabetes<-read.table("diabetes.txt", header=TRUE)
library(lars)
data(diabetes)
diabetes.lasso = lars(age+sex+bmi+map+td+ldl+hdl+tch+ltg+glu, y, type = "lasso")

但随后我收到错误消息: 'lars 中的错误(age+sex + bmi + map + td + ldl + hdl + tch + ltg + glu, y, type = "lasso"): 找不到对象'年龄''

我哪里错了?

编辑:数据 - 如下所示,但还有 5 列。

             ldl          hdl          tch          ltg          glu
1   -0.034820763 -0.043400846 -0.002592262  0.019908421 -0.017646125
2   -0.019163340  0.074411564 -0.039493383 -0.068329744 -0.092204050
3   -0.034194466 -0.032355932 -0.002592262  0.002863771 -0.025930339
4    0.024990593 -0.036037570  0.034308859  0.022692023 -0.009361911
5    0.015596140  0.008142084 -0.002592262 -0.031991445 -0.046640874

【问题讨论】:

  • 您能否在第一部分发布dput(diabetes) 的结果(以使其可重现)?
  • lars() x 应该是一个矩阵和y 一个向量。您的数据不太可能满足至少x 的要求,因为如果您显示的代码准确,那将是某个描述的单个向量。
  • 我的数据是一个 txt 文件,其中包含 10 个变量的大约 500 个数据样本。如何编辑代码以使其工作?我已经尝试了上面的2,但它不会工作。
  • 向我们展示您的数据,几行就足够了
  • 我已将我的数据添加到原始帖子中

标签: r regression lasso-regression lars


【解决方案1】:

我认为某些混淆可能与lars 包附带的diabetes 数据集具有不寻常的结构有关。

library(lars)
data(diabetes)
sapply(diabetes,class)
##        x         y        x2 
##   "AsIs" "numeric"    "AsIs" 

sapply(diabetes,dim)
## $x
## [1] 442  10
## 
## $y
## NULL
## 
## $x2
## [1] 442  64

换句话说,diabetes 是一个包含“列”的数据框它们本身就是矩阵。在这种情况下,with(diabetes,lars(x,y,type="lasso"))lars(diabetes$x,diabetes$y,type="lasso") 工作正常。 (但 lars(x,y,type="lasso") 不会,因为 R 不知道在 diabetes 数据框中查找 xy 变量。)

但是,如果您要读取自己的数据,则必须自己将响应变量和预测矩阵分开,例如

X <- as.matrix(mydiabetes[names(mydiabetes)!="y",])
mydiabetes.lasso = lars(X, mydiabetes$y, type = "lasso")

或者你可以使用

X <- model.matrix(y~.,data=mydiabetes)

【讨论】:

  • 'diabetes' 是 pkg:lars 附带的数据集之一(正如 OP 使用 data(diabetes) 所建议的那样。
  • 我已经尝试了上述方法,我得到: lars(x, y, type = "lasso") 中的错误:找不到对象'x'
  • 糖尿病对象是一个列表,其'x'元素是一个矩阵。 colnames(diabetes$x) [1] "age" "sex" "bmi" "map" "tc" "ldl" "hdl" "tch" "ltg" "glu"
  • 实际上它是一个矩阵...至少解释器是这样认为的:is.matrix(diabetes$x) [1] TRUE ... and ... is.data.frame(diabetes$x) [1] FALSE
  • 抱歉,我的意思是 diabetes 是一个数据框,而不是一个列表(IMO 让事情变得更加混乱)。我同意diabetes$x 是一个矩阵。
【解决方案2】:

lars::lars 似乎没有公式接口,这意味着您不能对列名使用公式规范(而且它不接受“data=”参数)。有关此主题和其他“数据挖掘”主题的更多信息,您可能想要获取经典文本的副本:“统计学习要素”。试试这个:

# this obviously assumes require(lars) and data(diabetes) have been executed.
> diabetes.lasso = with( diabetes, lars(x, y, type = "lasso"))
> summary(diabetes.lasso)
LARS/LASSO
Call: lars(x = x, y = y, type = "lasso")
   Df     Rss       Cp
0   1 2621009 453.7263
1   2 2510465 418.0322
2   3 1700369 143.8012
3   4 1527165  86.7411
4   5 1365734  33.6957
5   6 1324118  21.5052
6   7 1308932  18.3270
7   8 1275355   8.8775
8   9 1270233   9.1311
9  10 1269390  10.8435
10 11 1264977  11.3390
11 10 1264765   9.2668
12 11 1263983  11.0000

【讨论】:

    猜你喜欢
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 2019-06-06
    • 2020-10-31
    相关资源
    最近更新 更多