Hôm nay, tôi đã chơi xung quanh với một tập dữ liệu nhỏ và thực hiện một hồi quy OLS đơn giản mà tôi dự kiến sẽ thất bại do tính đa hình hoàn hảo. Tuy nhiên, nó đã không. Điều này ngụ ý rằng sự hiểu biết của tôi về đa cộng đồng là sai.
Câu hỏi của tôi là: Trong trường hợp tôi sai?
Tôi nghĩ rằng tôi có thể chỉ ra rằng một trong các biến của tôi là sự kết hợp tuyến tính của các biến khác. Điều này sẽ dẫn đến một ma trận hồi quy không có thứ hạng đầy đủ và do đó không nên xác định các hệ số.
Tôi đã tạo một bộ dữ liệu tái sản xuất nhỏ (mã bên dưới) :
exporter importer flow dist intraUS
1 Canada Canada 996.8677 6.367287 0
2 Florida Canada 995.8219 9.190562 0
3 Texas Canada 1001.6475 4.359063 0
4 Mexico Canada 1002.4371 7.476649 0
5 Canada Florida 1002.8789 5.389223 0
6 Florida Florida 1007.5589 6.779686 1
7 Texas Florida 996.8938 1.570600 1
8 Mexico Florida 1005.6247 5.910133 0
9 Canada Texas 999.9190 7.887672 0
10 Florida Texas 1004.1061 7.187803 1
11 Texas Texas 1004.5949 7.564273 1
12 Mexico Texas 1000.3728 2.021297 0
13 Canada Mexico 1003.0991 5.887743 0
14 Florida Mexico 999.2210 3.058495 0
15 Texas Mexico 997.6092 6.835883 0
16 Mexico Mexico 1006.7934 5.794425 0
Mỗi lần xuất khẩu và nhập khẩu là tiểu bang Hoa Kỳ, hình nộm intraUS
là 1
.
Bây giờ tôi thực hiện một hồi quy của (thương mại) flow
trên exporter
và các hình importer
nộm, dist
ance và hình intraUS
nộm. Cho ăn R với công thức sau đây lm(flow ~ dist + exporter + importer + intraUS, data = dat)
trả về ước tính cho tất cả các hệ số, không thiếu các giá trị hoặc cảnh báo về điểm kỳ dị:
(Intercept) dist exporterFlorida exporterTexas exporterMexico importerFlorida importerTexas importerMexico intraUS1
995.1033157 0.5744661 -1.2340338 -1.8792073 3.7375783 3.0361727 1.3256032 3.3225512 4.2429599
Câu đố này với tôi, bởi vì ma trận regressor cho thấy rõ ràng rằng intraUS
là sự kết hợp tuyến tính của exporterFlorida
, importerFlorida
, exporterTexas
và importerTexas
:
> mmat <- data.frame(model.matrix(lm(flow ~ dist + exporter + importer + intraUS, data = dat)))
X.Intercept. dist exporterFlorida exporterTexas exporterMexico importerFlorida importerTexas importerMexico intraUS1
1 1 6.367287 0 0 0 0 0 0 0
2 1 9.190562 1 0 0 0 0 0 0
3 1 4.359063 0 1 0 0 0 0 0
4 1 7.476649 0 0 1 0 0 0 0
5 1 5.389223 0 0 0 1 0 0 0
6 1 6.779686 1 0 0 1 0 0 1
7 1 1.570600 0 1 0 1 0 0 1
8 1 5.910133 0 0 1 1 0 0 0
9 1 7.887672 0 0 0 0 1 0 0
10 1 7.187803 1 0 0 0 1 0 1
11 1 7.564273 0 1 0 0 1 0 1
12 1 2.021297 0 0 1 0 1 0 0
13 1 5.887743 0 0 0 0 0 1 0
14 1 3.058495 1 0 0 0 0 1 0
15 1 6.835883 0 1 0 0 0 1 0
16 1 5.794425 0 0 1 0 0 1 0
Tính toán exporterFlorida * importerFlorida + exporterFlorida * importerTexas + exporterTexas * importerFlorida + exporterTexas * importerTexas
cho - không đáng ngạc nhiên - chính xác các giá trị trong intraUS1
.
Vì vậy, câu hỏi của tôi là, một lần nữa : Tại sao hồi quy này không thất bại, cho rằng một biến là một tổ hợp tuyến tính của các biến khác?
Dưới mã hoàn chỉnh, tái tạo dự toán:
## Generate data ####
set.seed(1)
states <- c("Canada", "Florida", "Texas", "Mexico")
dat <- expand.grid(states, states)
colnames(dat) <- c("exporter", "importer")
dat[, "flow"] <- NA
dat[, "dist"] <- NA
dat[, "intraUS"] <- 0
for (i in 1:nrow(dat)) {
dat[i, c("flow", "dist")] <- c(rnorm(1, mean = 1000, sd = 5), rnorm(1, mean = 6, sd = 2))
if (dat[i, "exporter"] %in% states[2:3] && dat[i, "importer"] %in% states[2:3]) {
dat[i, "intraUS"] <- 1
}
}
dat$intraUS <- factor(dat$intraUS)
## Run regression - works! ####
summary(lm(flow ~ dist + exporter + importer + intraUS, data = dat))
## Show that "intraUS1" is a linear combination of the dummies. ####
mmat <- data.frame(model.matrix(lm(flow ~ dist + exporter + importer + intraUS, data = dat)))
cbind(mmat, test = with(mmat,
exporterFlorida * importerFlorida + exporterFlorida * importerTexas +
exporterTexas * importerFlorida + exporterTexas * importerTexas
))[, c("intraUS1", "test")]