【问题标题】:How to eliminate variables with p value > 0.7 before computing stepwise polynomial regression?如何在计算逐步多项式回归之前消除p值> 0.7的变量?
【发布时间】:2019-10-30 03:52:23
【问题描述】:

我正在尝试使用具有 1,400 个变量的 AIC(通过step)运行逐步回归,但我的计算机只是死机。如果我包含

在我运行逐步回归之前,有没有办法消除一些变量(如果 p 值 >.7)?

# Polynomial Regression
REG19 <- lm(R10 ~ poly(M1, 3) + poly(M2, 3) + poly(M3, 3), WorkData)

# Is there a way to get rid of variables with 
# p values >.7 at this point of the code?

# Beginning of stepwise regression
n <- length(resid(REG19))
REG20 <- step(REG19, direction="backward", k=log(n))

【问题讨论】:

  • 你能用dput(head(df,n))添加你的数据样本吗?选择n,因为您可能会发现足以重现性。
  • 你想试试这样的:coef(summary(lm("Petal.Length~Sepal.Length+Petal.Width",data = iris))) %&gt;% as_tibble() %&gt;% filter(bac_tick_here_Pr(&gt;|t|) another_back_tick_here &lt; 0.00000002)?
  • 我强烈建议您咨询统计学家。你的基本方法已经很可疑了,但你的 p 值截止让它变得更糟。

标签: r regression non-linear-regression p-value poly


【解决方案1】:

您可能想要排除关于最高多项式的任何内容 p &lt;= .7 (应保留较低的度数)。假设您知道自己在做什么,您可以编写一个函数degAna(),分析每个多项式的次数并将其应用于summary 获得的系数矩阵。

REG19 <- lm(R10 ~ poly(M1, 3) + poly(M2, 3) + poly(M3, 3) + poly(M4, 3) +
              poly(M5, 3) + poly(M6, 3) + poly(M7, 3) + poly(M8, 3) + 
              poly(M9, 3) + poly(M10, 3), WorkData)

rr <- summary(REG19)$coefficients

p &lt;= .7检测最高度数的函数:

degAna <- function(d) {
  out <- as.matrix(rr[grep(paste0(")", d), rownames(rr)), "Pr(>|t|)"] <= .7)
  dimnames(out) <- list(c(gsub("^.*\\((.*)\\,.+", "\\1", rownames(out))), d)
  return(out)
}

lapplydegAna转系数矩阵:

dM <- do.call(cbind, lapply(1:3, degAna))  # max. degree always 3 as in example
#         1     2     3
# M1   TRUE  TRUE  TRUE
# M2   TRUE  TRUE  TRUE
# M3  FALSE  TRUE  TRUE
# M4   TRUE  TRUE  TRUE
# M5   TRUE  TRUE  TRUE
# M6   TRUE FALSE  TRUE
# M7   TRUE FALSE FALSE
# M8   TRUE  TRUE  TRUE
# M9   TRUE  TRUE FALSE
# M10  TRUE FALSE  TRUE

现在我们需要p &lt;= .7 的多项式的最后一个次数:

tM <- apply(dM, 1, function(x) max(which(x != 0)))
tM <- tM[tM > 0]  # excludes polynomes where every p < .7
# M1  M2  M3  M4  M5  M6  M7  M8  M9 M10 
#  3   3   3   3   3   3   1   3   2   3 

(请注意,如果多项式完全具有p &lt;= .7,则apply 将引发警告,即行完全是FALSE。由于我们在下一行中将它们丢弃,因此我们可以使用apply(dM, 1, function(x) suppressWarnings(max(which(x != 0)))) 忽略警告.)

有了这些信息,我们可以用reformulate 拼凑出一个新公式,

terms.new <- paste0("poly(", names(tM), ", ", tM, ")")
FO <- reformulate(terms.new, response="R10")
# R10 ~ poly(M1, 3) + poly(M2, 3) + poly(M3, 3) + poly(M4, 3) + 
#     poly(M5, 3) + poly(M6, 3) + poly(M7, 1) + poly(M8, 3) + poly(M9, 
#     2) + poly(M10, 3)

我们最终可以使用它进行所需的缩短回归。

REG19.2 <- lm(FO, WorkData)

n <- length(resid(REG19.2))
REG20.2 <- step(REG19.2, direction="backward", k=log(n))
# [...]

模拟数据

set.seed(42)
M1 <- rnorm(1e3)
M2 <- rnorm(1e3)
M3 <- rnorm(1e3)
M4 <- rnorm(1e3)
M5 <- rnorm(1e3)
M6 <- rnorm(1e3)
M7 <- rnorm(1e3)
M8 <- rnorm(1e3)
M9 <- rnorm(1e3)
M10 <- rnorm(1e3)
R10 <- 6 + 5*M1^3 + 4.5*M2^3 + 4*M3^2 + 3.5*M4 + 3*M5 + 2.5*M6 + 2*M7 + 
  .5*rnorm(1e3, 1, sd=20)
WorkData <- data.frame(M1, M2, M3, M4, M5, M6, M7, M8, M9, M10, R10)

【讨论】:

  • 非常感谢,但是在这行代码之后我收到了大约 50 行此错误:“tM
  • 我做了suppressWarnings() 并且它起作用了,但是这合法吗?
  • 是的,我只是在我的答案中添加了一些解释。当您检查相关行的输出时,您会发现-Inf,这表明没有x != 0。我们在下一行用tM[tM &gt; 0] 子集化了这个案例。这些只是没有多项式次数有p&lt;= .7 的情况,并且不会再包含在新公式中。好吗?
  • 谢谢,这是terms.new 行中的一个错误,它引用了dM 而不是tM。我改了,现在可以用了吗?
  • 完美!你是最棒的!
猜你喜欢
  • 2011-04-11
  • 2013-05-06
  • 2016-01-26
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 2016-08-24
  • 2015-08-13
  • 2021-11-11
相关资源
最近更新 更多