在R中子集data.frame不会改变回归结果

时间:2019-01-07 19:26:15

标签: r subset

当我使用lm在R中运行回归时,当我使用原始的data.frame和子集data.frame时,我会得到相同的回归结果。

我在R中有一个data.frame,其中包含来自特定公司的大约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中的所有内容,其中“年份”列的值为15,大约是data.frame的四分之一。

如果我对这个缩小的data.frame进行原始回归,则会得到非常不同的结果。

关于我可能会缺少的任何想法以及为什么在运行回归时为什么subset命令没有更改任何内容?

谢谢!

塞巴斯蒂安

2 个答案:

答案 0 :(得分:1)

这比您想像的要容易。

首先用splitYear 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)

现在使用该列表获取同乐的统计信息。
这将获得模型的系数。

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)

答案 1 :(得分:-1)

您能否尝试通过以下方式来显式回归:

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)

输出还是一样?