【问题标题】:R programming - not deleting the right columnR编程 - 不删除右列
【发布时间】:2018-08-02 01:37:55
【问题描述】:

我写信是为了在这里粘贴我的代码。 我正在学习 R 的在线课程,并试图自动化多变量回归。我试图检查发生了什么,一开始它可以工作,但是当涉及到最后两个变量时,它进入一个循环并且不会消除它们,即使它进入了 if。 最后,我有这个错误

Error in if (maxVar > sl) { : missing value where TRUE/FALSE needed

这里是代码

backwardElimination <-function(training,sl) {
  numVar=length(training)
  funzRegressor = lm(formula = profit ~.,
               data = training)
  p = summary(funzRegressor)$coefficients[,4]
  maxVar = max(p)
  if (maxVar > sl){
    for (j in c(1:numVar)){
      if (maxVar == p[j]) {
        training = training[, -j]
        backwardElimination(training,sl)
      }
    }
  }
  return(summary(funzRegressor))
}

提前致谢

编辑:这是我的代码的其余部分

#importing dataset
dataset = read.csv('50_Startups.csv')


# Encoding categorical data
dataset$State = factor(dataset$State,
                         levels = c('New York', 'California', 'Florida'),
                         labels = c(1, 2, 3))

#splitting in train / test set 
library(caTools)
set.seed(123)
split = sample.split(dataset$Profit, SplitRatio = 4/5)
trainingSet = subset(dataset, split == TRUE)
testSet = subset(dataset, split == FALSE)
#Transforming state in dummy variables
trainingSet$State = factor(trainingSet$State)
dummies = model.matrix(~trainingSet$State)
trainingSet = cbind(trainingSet,dummies)
profit = trainingSet$Profit
trainingSet = trainingSet[, -4]
trainingSet = trainingSet[, -4]
trainingSet = cbind(trainingSet,profit)
#calling the function
SL = 0.05
backwardElimination(trainingSet, SL)

【问题讨论】:

  • 它给了我这个错误Error in funzRegressor$coefficients[, 4] : incorrect number of dimensions
  • 6 我需要准确地获取 p 值的列

标签: r variables linear-regression


【解决方案1】:

此错误表明您的 if 语句中有 NA 而不是布尔值。

if (NA) {}
## Error in if (NA) { : missing value where TRUE/FALSE needed

您的p 要么包含NA,要么slNA

【讨论】:

  • 谢谢,我已经用我的其余代码编辑了我的帖子。
  • 尝试将Profit 与大写P 放在lm 公式中
  • 不,不是这样,因为当我创建虚拟变量时,我将其重命名为profit,它不适用于Profit。我做了一些调试,它进入了 if,但没有消除我想要的列...也许有一个逻辑错误,我在 training = training[, -j] 中无法发现
  • 能否提供summary(funzRegressor)
  • Call: lm(formula = profit ~ ., data = training) Residuals: Min 1Q Median 3Q Max -33128 -4865 5 6098 18065 Coefficients: Estimate Std. Error t value Pr(&gt;|t|) (Intercept) 4.965e+04 7.637e+03 6.501 1.94e-07 *** R.D.Spend 7.986e-01 5.604e-02 14.251 6.70e-16 *** Administration -2.942e-02 5.828e-02 -0.505 0.617 Marketing.Spend 3.268e-02 2.127e-02 1.537 0.134 trainingSet$State2 1.213e+02 3.751e+03 0.032 0.974 trainingSet$State3 2.376e+02 4.127e+03 0.058 0.954
【解决方案2】:

您的截距也会在下一步建模中反馈,您需要在进行下一次迭代之前将其删除。

【讨论】:

  • 非常感谢,我尝试删除拦截并没有错误...但可能还有另一个逻辑错误。 NA 肯定来自截距,但如果我删除它们,函数会直接返回,而不进入 if。因此它返回完整回归的摘要,而不删除不相关的变量。
  • 你能浏览一下 trainingSet 看看是否有意外的 'intercept' 变量吗?
  • 我可以看到trainingSet = cbind(trainingSet,dummies) 作为dummies' has an intercept` 变量引起了问题。使用trainingSet = cbind(trainingSet,dummies[,-1]) 删除它,您应该可以通过。
  • 另外,在递归调用函数的同时还需要控制流程。
  • 这就是我所做的,但在删除截距变量后,它直接进入return(summary(funzRegressor)),而不删除对回归模型不重要的列。不知道为什么
【解决方案3】:

我可以使用 R 内置数据集 state.x77 复制您的错误

dataset <- as.data.frame(state.x77)
dataset$State <- rownames(dataset) 
dataset$profit <- rnorm(nrow(dataset))

backwardElimination <-function(training,sl) {
    if (!"profit" %in% names(training)) return(NULL)

    numVar=length(training)
    funzRegressor = lm(formula = profit ~.,
        data = training)
    p = summary(funzRegressor)$coefficients[,4]
    maxVar = max(p)
    #print(funzRegressor)

    if (maxVar > sl){
        for (j in c(1:numVar)){
            if (maxVar == p[j]) {
                training = training[, -j]
                backwardElimination(training,sl)
            }
        }
    }
    return(summary(funzRegressor))
}
backwardElimination(dataset, 0.05)

在您的某些 beta 中存在 NA,所有 p 值都变为 NaN。你需要在州内倒退吗?否则,您可以删除 State 列以消除错误。

当你在递归中到达边界情况时会出现另一个错误,你可以修复它:)

【讨论】:

  • 我也想回归状态,无论如何我已经尝试删除它们,只是为了检查,现在它给了我这个错误Error in terms.formula(formula, data = data) : '.' in formula and no 'data' argument In addition: Warning messages: 1: In summary.lm(funzRegressor) : essentially perfect fit: summary may be unreliable 2: In summary.lm(funzRegressor) : essentially perfect fit: summary may be unreliable 3: In summary.lm(funzRegressor) : essentially perfect fit: summary may be unreliable 4: In summary.lm(funzRegressor) :
  • 不看数据就很难判断。最有可能的列之一 = 利润列
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 2011-09-02
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 2022-11-09
  • 2011-03-03
相关资源
最近更新 更多