当我使用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命令没有更改任何内容?
谢谢!
塞巴斯蒂安
答案 0 :(得分:1)
这比您想像的要容易。
首先用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)
现在使用该列表获取同乐的统计信息。
这将获得模型的系数。
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)
输出还是一样?