Я потратил дни на поиск оптимальных моделей, которые удовлетворяли бы всем стандартным предположениям OLS (нормальное распределение, гомоскедастичность, отсутствие мультиколлинеарности) в R, но с 12 переменными невозможно найти оптимальную комбинацию переменных. Поэтому я пытался создать скрипт, который бы автоматизировал этот процесс.
Вот пример кода для вычислений:
x1 <- runif(100, 0, 10)
x2 <- runif(100, 0, 10)
x3 <- runif(100, 0, 10)
x4 <- runif(100, 0, 10)
x5 <- runif(100, 0, 10)
df <- as.data.frame(cbind(x1,x2,x3,x4,x5))
library(lmtest)
library(car)
model <- lm(x1~x2+x3+x4+x5, data = df)
# check for normal distribution (Shapiro-Wilk-Test)
rs_sd <- rstandard(model)
shapiro.test(rs_sd)
# check for heteroskedasticity (Breusch-Pagan-Test)
bptest(model)
# check for multicollinearity
vif(model)
#-------------------------------------------------------------------------------
# models without outliers
# identify outliers (calculating the Cooks distance, if x > 4/(n-k-1) --> outlier
cooks <- round(cooks.distance(model), digits = 4)
df_no_out <- cbind(df, cooks)
df_no_out <- subset(df_no_out, cooks < 4/(100-4-1))
model_no_out <- lm(x1~x2+x3+x4+x5, data = df_no_out)
# check for normal distribution
rs_sd_no_out<- rstandard(model_no_out)
shapiro.test(rs_sd_no_out)
# check for heteroskedasticity
bptest(model_no_out)
# check for multicollinearity
vif(model_no_out)
Что я имею в виду, так это перебрать все комбинации переменных и получить P-ЗНАЧЕНИЯ для shapiro.test() и bptest() или значения VIF для всех созданных моделей, чтобы я мог сравнить значения значимости или мультиколлинеарность соотв. (в моем наборе данных мультиколлинеарность не должна быть проблемой, и поскольку для проверки мультиколлинеарности тест VIF выдает больше значений (для каждого фактора var 1xVIF), которые, вероятно, будет сложнее реализовать в коде), p-значения для shapiro.test + bptest() будет достаточно…).
Я пытался написать несколько скриптов, которые бы автоматизировали процесс, но безуспешно (к сожалению, я не программист). Я знаю, что уже есть несколько тем, посвященных этой проблеме.
Как запустить lm модели, использующие все возможные комбинации нескольких переменных и фактора
Поиск наилучшей комбинации переменных для высоких Значения R-квадрата
но я не нашел скрипт, который также вычислял бы ТОЛЬКО P-ЗНАЧЕНИЯ.
Особенно важны тесты для моделей без выбросов, потому что после удаления выбросов во многих случаях выполняются предположения МНК.
Я был бы очень признателен за любые предложения или помощь в этом.
as.data.frame(cbind(.))
. В этом случае проблем нет, но если одна из переменных класса"character"
, то все они станут символами, как только выcbind
их вместе. - person Rui Barradas   schedule 16.11.2018