我使用glmnet
包来运行多项式Lasso回归。 当使用family="multinomial"
和一个具有p
个变量和n
个样本以及pmax=x
的数据集时,如果x
是奇数(如果不是pmax>p
),则会发生分段错误。 在这种情况下,它很可能被忽略,因为它没有影响。 例如:
n=100
p=20
require(glmnet)
D= as.data.frame(replicate(p, rnorm(n)))
D[,p] = as.factor(round(rnorm(n)))
lasso <- glmnet(data.matrix(D[, -p]), D[, p], standardize=T, family="multinomial") ## works
lasso <- glmnet(data.matrix(D[, -p]), D[, p], standardize=T, family="multinomial", pmax=7) ## works, because it is odd
lasso <- glmnet(data.matrix(D[, -p]), D[, p], standardize=T, family="multinomial", pmax=24 ## works, because pmax>p
lasso <- glmnet(data.matrix(D[, -p]), D[, p], standardize=T, family="multinomial", pmax=10)## crashes
以及错误消息:
*** caught segfault ***
address 0x22de58a8, cause 'memory not mapped'
Traceback:
1: .Fortran("lognet", parm = alpha, nobs, nvars, nc, as.double(x), y, offset, jd, vp, cl, ne, nx, nlam, flmin, ulam, thresh, isd, intr, maxit, kopt, lmu = integer(1), a0 = double(nlam * nc), ca = double(nx * nlam * nc), ia = integer(nx), nin = integer(nlam), nulldev = double(1), dev = double(nlam), alm = double(nlam), nlp = integer(1), jerr = integer(1), PACKAGE = "glmnet")
2: lognet(x, is.sparse, ix, jx, y, weights, offset, alpha, nobs, nvars, jd, vp, cl, ne, nx, nlam, flmin, ulam, thresh, isd, intr, vnames, maxit, kopt, family)
3: glmnet(data.matrix(D[, -p]), D[, p], standardize = T, family = "multinomial", pmax = 10)
我的第一个问题是:为什么?这里是否有数学上的原因?(我想应该有...)
第二个问题是:难道没有更好的解决方案吗?比如警告之类的?或者只是使用pmax<-pmax-1
?
编辑:好的,看起来要复杂一些。有时候,只有在我第二次使用相同的命令并使用相同的pmax数字时才会出现分段错误。
另外,我发现了这个错误:
*** glibc detected *** /usr/lib64/R/bin/exec/R: double free or corruption (out): 0x0000000005c41720 ***
======= Backtrace: =========
....
对于pmax中的奇数和偶数数字,两者都适用...
现在看起来更像是一个bug了...或者?
编辑2: 我在64位linux环境下使用R 2.15.2和glmnet 1.9-5运行。 另外,在ubuntu 64位和R 3.0.2上的另一台PC上也出现了分段错误。