Как исключить переменные со значением p> 0,7 перед вычислением пошаговой полиномиальной регрессии?

Я пытаюсь запустить пошаговую регрессию с использованием AIC (через step) с 1400 переменными, но мой компьютер просто зависает. Это сработает, если я включу ‹300 переменных (после 13 часов работы).

Есть ли способ удалить некоторые переменные (если значение p> 0,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))

person RegressionMan    schedule 16.06.2019    source источник
comment
Не могли бы вы добавить образец своих данных с помощью dput(head(df,n))? Выберите n, поскольку может быть достаточно для воспроизводимости.   -  person NelsonGon    schedule 16.06.2019
comment
Хотите попробовать что-то вроде этого: coef(summary(lm("Petal.Length~Sepal.Length+Petal.Width",data = iris))) %>% as_tibble() %>% filter(bac_tick_here_Pr(>|t|) another_back_tick_here < 0.00000002)?   -  person NelsonGon    schedule 16.06.2019
comment
Я настоятельно рекомендую вам проконсультироваться со статистиком. Ваш основной подход уже очень сомнительный, но ваше значение p-value усугубляет ситуацию.   -  person Roland    schedule 16.06.2019


Ответы (1)


Вы, вероятно, захотите исключить что-либо о наивысшем полиноме, где p <= .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 <= .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)
}

lapply degAna в матрицу коэффициентов:

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 <= .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 

(Обратите внимание, что apply выдаст предупреждение, если многочлен полностью имеет p <= .7, т.е. строка полностью соответствует 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)
person jay.sf    schedule 16.06.2019
comment
Большое вам спасибо, но после этой строки кода у меня появилось около 50 строк этой ошибки: tM ‹- apply (dM, 1, function (x) max (which (x! = 0))) ...... .................. Infno без пропущенных аргументов до max; возвращение -Infno без пропущенных аргументов в max; возвращение -Infno без пропущенных аргументов в max; возвращение -Infno без пропущенных аргументов в max; возвращение -Infno без пропущенных аргументов в max; возвращение -Infno без пропущенных аргументов в max; возвращение - - person RegressionMan; 16.06.2019
comment
Я использовал suppressWarnings (), и это сработало, но это законно? - person RegressionMan; 16.06.2019
comment
Да, я просто добавил это к своему ответу с некоторыми пояснениями. Когда вы проверяете вывод соответствующей строки, вы найдете -Inf, что означает отсутствие x != 0. Мы выбрасываем эти случаи в следующей строке, где мы подмножество с tM[tM > 0] . Это как раз те случаи, когда степень полинома не имела p<= .7 и больше не будет включена в новую формулу. Хорошо? - person jay.sf; 16.06.2019
comment
Спасибо, но когда одна из переменных, таких как M6, имеет значение FALSE для всех 3, шаг переформулирования все равно возвращает M6 (вместо удаления M6 из шага переформулирования). [ссылка] (ibb.co/rv6bBqx). Например, M65 = 2, но при переформатировании M7 = 2, потому что M65 - это седьмая переменная, включенная с самого начала (поскольку другие были удалены). - person RegressionMan; 16.06.2019
comment
Спасибо, это была ошибка в строке terms.new, которая относилась скорее к dM, а не к tM. Поменял, теперь работает? - person jay.sf; 16.06.2019
comment
ИДЕАЛЬНО! Ты самый лучший! - person RegressionMan; 16.06.2019