glmnet错误(nulldev == 0)停止(“y是常数;高斯glmnet在标准化步骤中失败”)

5

我正在使用R中的glmnet运行以下(截断)代码:

# do a lot of things to create the design matrix called x.design

> glmnet(x.design, y, thresh=1e-11)

当我运行代码时,我遇到了以下错误信息:

其中x.design是一个n x p的设计矩阵,其中n > p,而y是使用核密度估计法获得的n x 1响应向量。 x.designy都包含实数条目。

Error in if (nulldev == 0) stop("y is constant; gaussian glmnet fails at 
standardization step") : missing value where TRUE/FALSE needed 

我已经访问并阅读了在R中运行glmnet包时出现错误"missing value where TRUE/FALSE needed",可能是由于缺失值引起的?

但是我无法找到解决方法。

请有人能提供一个解决方案吗?


"dput(x.design)"和"dput(y)"太大了,无法复制和粘贴。其中,"x.design"是一个658 x 15的矩阵,而"y"是一个658 x 1的向量。 - NM_
1
请复制并粘贴 str(x.design)str(y) 的输出。 - Marco Sandri
@MarcoSandri:谢谢你,有了你的帮助我找到了问题所在。在输入“str(y)”后,我发现核密度估计产生了一些NaN值。 - NM_
很高兴能帮助你...! - Marco Sandri
3个回答

4

看起来你的响应向量 y 是常数。GLMNET 尝试将其标准化(可能是减去平均值,然后除以当前标准差),但无法完成,因为标准差为0。打印y和它的方差以确保。

您还应检查您的内核估计过程。


2
原来问题是 y 中有 NaN。 - NM_

2
尝试通过-->na.omit(data)从数据中删除空值。

1

对于这个问题的一个更普遍的答案是,glmnet不像R中的其他“回归”函数处理任何类型的缺失值(无论是NA,NaN还是其他方式),如here所述。从这个意义上说,它只适用于完整的案例。

因此,我建议解决上述错误消息的方法是从输入矩阵x.design中删除所有行,这些行对应于响应向量y中的非数字值。例如,可以使用以下代码:

x.design <- x.design[grep("\\d", y)]

这段代码使用正则表达式来选择响应向量中包含数字(字面数字)的行,并根据这些行对输入矩阵进行子集化(glmnet函数实际可以使用的行)。

然后,您也可以以相同的方式对响应向量进行子集化,然后就可以开始了(自然地,在对输入矩阵进行子集化之后,对响应向量进行子集化非常重要):

y <- y[grep("\\d", y)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接