【问题标题】:Why lm() not showing some output in R?为什么 lm() 没有在 R 中显示一些输出?
【发布时间】:2019-11-08 16:07:21
【问题描述】:

我想知道为什么lm()5 coefs not defined because of singularities 然后在总结输出中给出所有NA 5 个系数。

请注意,我所有的预测都是分类的。

我在这 5 个系数或代码上的数据有什么问题吗?我该如何解决这个问题?

d <- read.csv("https://raw.githubusercontent.com/rnorouzian/m/master/v.csv", h = T) # Data

nms <- c("Age","genre","Length","cf.training","error.type","cf.scope","cf.type","cf.revision")

d[nms] <- lapply(d[nms], as.factor) # make factor

vv <- lm(dint~Age+genre+Length+cf.training+error.type+cf.scope+cf.type+cf.revision, data = d)

summary(vv) 

前 6 行输出:

     Coefficients: (5 not defined because of singularities)
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)    0.17835    0.63573   0.281 0.779330    
Age1          -0.04576    0.86803  -0.053 0.958010    
Age2           0.46431    0.87686   0.530 0.596990    
Age99         -1.64099    1.04830  -1.565 0.118949    
genre2         1.57015    0.55699   2.819 0.005263 ** 
genre4              NA         NA      NA       NA    ## For example here is all `NA`s? there are 4 more !

【问题讨论】:

  • 如果您有分类变量,请使用 glm 而不是 lm

标签: r dataframe regression


【解决方案1】:

正如其他人所指出的,一个问题是您似乎存在多重共线性。另一个是您的数据集中缺少值。缺失的值可能应该被删除。至于相关变量,您应该检查您的数据以识别这种共线性,并将其删除。决定删除哪些变量以及保留哪些变量是一个非常特定于领域的主题。但是,如果您希望决定使用 regularisation 并在保留所有变量的同时拟合模型,则可以。这还允许您在 n(样本数)小于 p(预测变量数)时拟合模型。

下面的代码演示了如何检查数据中的相关结构,并确定哪些变量最相关(感谢this answer。我提供了一个使用 L2 拟合此类模型的示例正则化(通常称为岭回归)。

d <- read.csv("https://raw.githubusercontent.com/rnorouzian/m/master/v.csv", h = T) # Data

nms <- c("Age","genre","Length","cf.training","error.type","cf.scope","cf.type","cf.revision")

d[nms] <- lapply(d[nms], as.factor) # make factor

vv <- lm(dint~Age+genre+Length+cf.training+error.type+cf.scope+cf.type+cf.revision, data = d)


df <- d
df[] <- lapply(df, as.numeric)
cor_mat <- cor(as.matrix(df), use = "complete.obs")

library("gplots")
heatmap.2(cor_mat, trace = "none")

## https://stackoverflow.com/questions/22282531/how-to-compute-correlations-between-all-columns-in-r-and-detect-highly-correlate
library("tibble")
library("dplyr")
library("tidyr")

d2 <- df %>% 
  as.matrix() %>%
  cor(use = "complete.obs") %>%
  ## Set diag (a vs a) to NA, then remove
  (function(x) {
    diag(x) <- NA
    x
  }) %>%
  as.data.frame %>%
  rownames_to_column(var = 'var1') %>%
  gather(var2, value, -var1) %>%
  filter(!is.na(value)) %>%
  ## Sort by decreasing absolute correlation
  arrange(-abs(value))

## 2 pairs of variables are almost exactly correlated!
head(d2)
#>         var1       var2     value
#> 1         id study.name 0.9999430
#> 2 study.name         id 0.9999430
#> 3   Location      timed 0.9994082
#> 4      timed   Location 0.9994082
#> 5        Age   ed.level 0.7425026
#> 6   ed.level        Age 0.7425026
## Remove some variables here, or maybe try regularized regression (see below)
library("glmnet")

## glmnet requires matrix input
X <- d[, c("Age", "genre", "Length", "cf.training", "error.type", "cf.scope", "cf.type", "cf.revision")]
X[] <- lapply(X, as.numeric)
X <- as.matrix(X)
ind_na <- apply(X, 1, function(row) any(is.na(row)))
X <- X[!ind_na, ]
y <- d[!ind_na, "dint"]
glmnet <- glmnet(
    x = X,
    y = y,
    ## alpha = 0 is ridge regression
    alpha = 0)

plot(glmnet)

reprex package (v0.3.0) 于 2019 年 11 月 8 日创建

【讨论】:

  • 谢谢,但是我所有的数据都是分类的!!
  • 您的数据分类有什么意义?线性回归适用于分类预测变量。
  • 谢谢 我的意思是在分类数据上使用皮尔逊相关性,当前热图的确切解释是什么?
  • 它是相关系数的热图。每个单元格代表数据集中两个变量之间的成对相关系数。当转换为数字时,Pearson 相关性也适用于分类数据 - 事实上,Spearman 可能会因为关系而遇到困难。
  • 另外你提到数据中有一些缺失,但我能找到,你能告诉我它们在哪里吗?
【解决方案2】:

在这种情况下,您可以使用 R 中的“olsrr”包进行逐步回归分析。我正在为您提供一个示例代码,用于在 R 中进行逐步回归分析

library("olsrr")

#Load the data
d <- read.csv("https://raw.githubusercontent.com/rnorouzian/m/master/v.csv", h = T)

# stepwise regression 
vv <- lm(dint ~ Age + genre + Length + cf.training + error.type + cf.scope + cf.type + cf.revision, data = d)

summary(vv)  

k <- ols_step_both_p(vv, pent = 0.05, prem = 0.1)

# stepwise regression plot 
plot(k)

# final model 
k$model

它将为您提供与 SPSS 完全相同的输出。

【讨论】:

  • 我能否改为删除当前为 NA 的变量,例如 genre4 给出 NA 那么有没有办法从数据中删除特定级别的 genre
  • @Reza 现在尝试编辑,删除高度相关的变量后它工作正常。
  • d[nms] &lt;- lapply(d[nms], as.factor) 造成了问题。现在有了原始数据,逐步回归模型运行良好。
  • 我明白你的意思,但是预测变量之间允许多少相关性是有切点的吗?
  • 经验法则是|相关| >0.7。虽然可能会因数据集而异。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
  • 2021-02-20
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多