glmnet error(nulldev == 0)stop(“y是常量; Gaussian glmnet在标准化步骤失败”)

vq8itlhq  于 2023-05-11  发布在  其他
关注(0)|答案(3)|浏览(444)

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

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

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

其中 x.designn x p 设计矩阵,其中 n > py 是使用核密度估计获得的响应的 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

我参观过,读过
Running glmnet package in R, getting error "missing value where TRUE/FALSE needed", maybe due to missing values?
然而,我想不出一个方法来解决我的问题。
有人能提出解决方案吗?

vof42yt1

vof42yt11#

看起来你的响应向量y是恒定的。GLMNET尝试将其标准化(可能减去平均值,然后除以当前stddev),但由于stddev为0,因此无法进行标准化。打印y及其方差以确保。
您还应该检查您的内核估计过程。

vngu2lb8

vngu2lb82#

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

gab6jxml

gab6jxml3#

对这个问题的一个更一般的回答是,glmnet不像here所描述的那样处理任何类型的缺失值,比如R中的其他“回归”函数(无论是NAs,NaNs还是其他)。它只适用于这种意义上的完整案例。
因此,我对上面的错误消息提出的解决方案是从输入矩阵x.design中删除与响应向量y中的非数值对应的所有行。例如,类似这样的东西可以做到:

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

这段代码简单地使用正则表达式来选择响应向量中包含数字(字面数字)的行,并根据这些行(glmnet函数实际可以使用的行)对输入矩阵进行子集化。
然后,你也可以用同样的方式子集化你的响应向量,你就可以开始了(自然地,在输入矩阵之后子集化响应向量是很重要的):

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

相关问题