Подмножество data.frame в R не изменяет результаты регрессии - PullRequest
0 голосов
/ 07 января 2019

Когда я запускаю регрессию в R, используя lm, я получаю идентичный результат регрессии, когда я использую исходный data.frame и когда я помещаю data.frame в подмножество.

У меня есть data.frame в R с данными за четыре года из 250 различных филиалов для конкретной компании.

Я хочу регрессировать две переменные за весь четырехлетний период, а затем регрессировать за отдельные годы.

Однако, когда я включаю команду подмножества, чтобы ограничить регрессию определенным годом, я не получаю никаких ошибок, и регрессия идентична той за весь четырехлетний период.

Я пробовал использовать несколько разных методов подмножества, и у меня каждый раз одна и та же проблема. Я полагаю, что я правильно делаю поднаборы, потому что я не получаю никаких сообщений об ошибках, и я могу правильно выполнить поднабор с этими же командами в других обстоятельствах.

Вот регрессия, которую я провел за весь четырехлетний период, и результаты:

> summary(lm(branch_annual$Unfairness_Scale ~ branch_annual$OS_EmpDSup, 
data = branch_annual))

Call:
lm(formula = branch_annual$Unfairness_Scale ~ branch_annual$OS_EmpDSup, 
    data = branch_annual)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.4815 -0.7767 -0.0109  0.8676  2.4406 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)    
(Intercept)               1.67381    0.32745   5.112  4.3e-07 ***
branch_annual$OS_EmpDSup  0.22354    0.08323   2.686  0.00744 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.091 on 599 degrees of freedom
  (344 observations deleted due to missingness)
Multiple R-squared:  0.0119,    Adjusted R-squared:  0.01025 
F-statistic: 7.214 on 1 and 599 DF,  p-value: 0.007435

Я получаю точно такой же результат, когда запускаю следующую команду:

> summary(lm(branch_annual$Unfairness_Scale ~ branch_annual$OS_EmpDSup, 
data = subset(branch_annual, year == 15 )))

Если я поставлю 15 в кавычках, ничего не изменится.

Я считаю, что правильно использую команду subset, потому что, если я запускаю следующую команду:

> branch_annual_15 <- subset(branch_annual, year == 15)

Он правильно создает data.frame, который включает все в branch_annual, для которого столбец "year" имеет значение 15, что составляет примерно одну четверть data.frame.

Если я запускаю исходную регрессию для этого уменьшенного data.frame, я получаю совсем другой результат.

Есть идеи о том, чего мне не хватает и почему команда подмножества ничего не меняет, когда я запускаю регрессию?

Спасибо!

Себастьян

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Это проще, чем вы думаете.

Сначала split фрейм данных по Year и Branch, создавая столько фреймов данных, сколько существует комбинаций значений этих двух столбцов.
Затем запустите все регрессии с помощью lapply циклов.

nms <- names(branch_annual)[-(1:3)]
sp <- split(branch_annual, list(branch_annual$Year, branch_annual$Branch))

lm_list <- lapply(sp, function(DF){
  res <- lapply(nms, function(pred){
    fmla <- as.formula(paste("Y", pred, sep = "~"))
    lm(fmla, data = DF)
  })
  names(res) <- nms
  res
})

lm_list <- unlist(lm_list, recursive = FALSE)

Теперь используйте список для получения статистики по interess.
Это получит коэффициенты моделей.

coef_list <- t(sapply(lm_list, coef))
colnames(coef_list)[2] <- "regressor"

В качестве альтернативы, вычислите подходящие модели summary и извлеките полные данные.фреймы с оценками коэффициентов, степеней свободы, R в квадрате, p-значениями и т. Д.

smry_list <- lapply(lm_list, summary)

coef_list2 <- lapply(smry_list, '[[', "coefficients")
R2 <- sapply(smry_list, '[[', "r.squared")

Проверка кода создания данных.

set.seed(1234)

Branch <- sprintf("branch%03d", 1:250)
b <- length(Branch)
branch_annual <- data.frame(Year = rep(2015:2018, each = 5*b),
                            Branch = rep(Branch, 20))
m <- nrow(branch_annual)
Y <- runif(m, 0, 100)
preds <- matrix(runif(m*7, 0, 100), nrow = m)
colnames(preds) <- LETTERS[1:7]
branch_annual <- cbind(branch_annual, Y, preds)
0 голосов
/ 07 января 2019

Можете ли вы попытаться объяснить регрессию, выполнив:

lmFull <- lm(branch_annual$Unfairness_Scale ~ branch_annual$OS_EmpDSup, 
data = branch_annual)
lmSub <- lm(branch_annual$Unfairness_Scale ~ branch_annual$OS_EmpDSup, 
data = subset(branch_annual, year == 15 ))
lmSubBis <- lm(branch_annual$Unfairness_Scale ~ branch_annual$OS_EmpDSup, 
data = branch_annual[branch_annual$year == 15,])

и затем выполнить сравнение

summary(lmFull)
summary(lmSub)
summary(lmSubBis)

Выходы все те же?

...