在最佳子集回归(游标或正子集)中使用因子作为自变量的问题

我正在尝试在R中做最好的子集回归。使用leaps()regsubsets()(来自leaps包),如果我所有的独立(解释性)变量都可以很好地工作是数字。但是,如果我包括一个因素,它将失败并显示错误消息:

  

jumps.setup(x,y,wt = wt,nbest = nbest,nvmax = NCOL(x)+ int,的错误:     外部函数调用中的NA / NaN / Inf(arg 3)   另外:警告消息:   在jumps.setup(x,y,wt = wt,nbest = nbest,nvmax = NCOL(x)+ int,:     .Fortran

中使用的char向量中只有第一个字符串

我已经对所有数据集进行了爬网,并且绝对没有任何NA / NaN / Inf值;我还尝试生成人为因素值,而不是使用数据集中的值,因此得到相同的结果。如果我在R之外创建虚拟变量来表示因子值,则它运行得很好,因此它与数据本身无关。我尝试过使用带或不带标签的因子水平,并在原始数据中使用数字或字符因子值进行尝试:在每种情况下,结果相同。这是我使用的方法之一:

zoo1 <- within(panda,AltitudeZoo1 <- relevel(factor(Altitude),"2134"))

但在线文档声称可以在leaps()中使用因素,例如this document。我发现各种报告,包括StackOverflow中的报告,都大致相同的错误消息(通常是抱怨的“ arg”数字不同),但都与randomForest例程有关。

我使用leaps()还是regsubsets()都没关系。

有什么想法吗?解决方法是回到在R之外创建虚拟变量的方法,但这很烦人。

这是一个可复制的示例:首先是代码

reprex = read.csv("reprexdata.csv",head = T)
library(leaps)

##creating dummy variable
reprex$xfactordata.f<-factor(reprex$xfactordata)
##checking dummy variables work ok with simple regression
m<-lm(reprex$y~reprex$x1data+reprex$x2data+reprex$xfactordata.f) 
summary(m)

##now try best subsets regression
y<-reprex$y
x <- reprex[,c (2,3,5)] ## picks up x1data,x2data,xfactordata.f
Z <- leaps(x,y,method = "adjr2",nbest = 1) ## running leaps subset regression
Z

接下来,我测试了上面代码的数据,该数据适当地产生了先前报告的错误(33行):

ydata   x1data  x2data  xfactordata
139.3983228 2   0.555555556 2134
159.4909669 1   0.28125 2134
162.979101  0   0   1780
158.523721  0   0   1780
167.9430665 1   0.526509081 2134
150.4105583 1   0.21875 2134
136.6799004 2   8.428819444 2134
142.9603016 1   0.026041667 2134
149.3782133 1   0.364583333 2134
162.3022502 0   2.725694444 2084
159.8686527 0   1.085069444 2084
129.5367811 0   14.04513889 2084
133.8219284 0   8.697916667 2084
152.7590267 2   2.81421023  2134
167.6079507 1   0.251736111 1780
157.4867615 2   0.915798611 2134
146.8897681 2   1.40625 2134
151.4678525 1   0.769842804 2134
174.3412577 2   2.612847222 2084
150.0527068 2   0.885416667 2134
139.3348421 1   2.560763889 2134
159.4110442 2   1.66626408  2134
164.2695334 2   0.958333333 2134
154.5591851 1   1.980372102 2134
160.5290024 1   1.225   2134
154.4028751 1   1.370983414 2134
144.0339001 1   0.520833333 2134
145.5653995 2   0   2134
161.8175311 1   1.271701389 2134
139.338698  1   3.8875  2134
163.2222006 1   0.703125    2084
146.2958403 1   0   2134
hongfuxiao 回答:在最佳子集回归(游标或正子集)中使用因子作为自变量的问题

leaps()函数需要一个 model矩阵(即,仅是一个数值矩阵,而regsubsets可以采用一个公式自变量(自动从一个一组指定的预测变量,可能包括因子); example you link(我认为这是一个“示例”,而不是“文档”;该包中的参考文档(例如,here)没有)在任何地方都可以显示示例或明确地说允许使用因子(它仅表示x是“预测因子矩阵”,从技术上讲不允许这样做-在尝试时将因子转换为character将它们放入矩阵)。

以下是将包含一个或多个因子的一组预测变量转换为预测的数值矩阵(包括作为多个虚拟变量的因子)的方法:

x <- model.matrix(~x1data+x2data+xfactordata.f,data=reprex)
Z <- leaps(x,reprex$y,method="adjr2",nbest=1)

在您的特定示例中,这将返回错误

  

leaves需要完整的设计矩阵;使用regsubsets()

但是我认为这是因为您的示例人为地小了(您碰巧将一组完全共线的预测变量放在一起)。

如广告所示,如果您指定公式,regsubsets()会自动为您执行此步骤:

regsubsets(y~x1data+x2data+xfactordata.f,data=reprex)

如果您知道要使用数据帧中的所有列作为除响应变量以外的预测变量,则可以说regsubsets(y~.,data=reprex),或者在这种情况下说regsubsets(y ~ . - xfactordata)(因为不想xfactordataxfactordata.f

本文链接:https://www.f2er.com/3148935.html

大家都在问