Cách dễ nhất, IMO, là tự xây dựng ma trận thiết kế, vì glmfit
chấp nhận hoặc là ma trận các giá trị thô (quan sát) hoặc ma trận thiết kế. Mã hóa một thuật ngữ tương tác không khó lắm khi bạn đã viết mô hình đầy đủ. Giả sử chúng ta có hai yếu tố dự đoán là (liên tục) và (phân loại, với ba cấp độ không có thứ tự, giả sử ). Sử dụng ký hiệu của Wilkinson, chúng tôi sẽ viết mô hình này như là , bỏ qua phía bên trái (đối với kết quả nhị thức, chúng tôi sẽ sử dụng chức năng liên kết logit). Chúng ta chỉ cần hai vectơ giả để mã hóa các mức (như hiện tại / vắng mặt cho một quan sát cụ thể), vì vậy chúng ta sẽ có 5 hệ số hồi quy, cộng với một thuật ngữ chặn. Điều này có thể được tóm tắt làxgg=1,2,3y ~ x + g + x:g
g
β0+β1⋅x+β2⋅Ig=2+β3⋅Ig=3+β4⋅x×Ig=2+β5⋅x×Ig=3,
trong đó là viết tắt của một ma trận chỉ báo mã hóa mức .Ig
Trong Matlab, sử dụng ví dụ trực tuyến, tôi sẽ làm như sau:
x = [2100 2300 2500 2700 2900 3100 3300 3500 3700 3900 4100 4300]';
g = [1 1 1 1 2 2 2 2 3 3 3 3]';
gcat = dummyvar(g);
gcat = gcat(:,2:3); % remove the first column
X = [x gcat x.*gcat(:,1) x.*gcat(:,2)];
n = [48 42 31 34 31 21 23 23 21 16 17 21]';
y = [1 2 0 3 8 8 14 17 19 15 17 21]';
[b, dev, stats] = glmfit(X, [y n], 'binomial', 'link', 'probit');
Tôi đã không bao gồm một cột của những người cho đánh chặn vì nó được bao gồm theo mặc định. Ma trận thiết kế trông giống như
2100 0 0 0 0
2300 0 0 0 0
2500 0 0 0 0
2700 0 0 0 0
2900 1 0 2900 0
3100 1 0 3100 0
3300 1 0 3300 0
3500 1 0 3500 0
3700 0 1 0 3700
3900 0 1 0 3900
4100 0 1 0 4100
4300 0 1 0 4300
và bạn có thể thấy rằng các điều khoản tương tác chỉ được mã hóa là sản phẩm của x
với cột tương ứng là g
(g = 2 và g = 3, vì chúng ta không cần cấp độ đầu tiên).
Các kết quả được đưa ra dưới đây, như các hệ số, sai số chuẩn, thống kê và giá trị p (từ stats
cấu trúc):
int. -3.8929 2.0251 -1.9223 0.0546
x 0.0009 0.0008 1.0663 0.2863
g2 -3.2125 2.7622 -1.1630 0.2448
g3 -5.7745 7.5542 -0.7644 0.4446
x:g2 0.0013 0.0010 1.3122 0.1894
x:g3 0.0021 0.0021 0.9882 0.3230
Bây giờ, kiểm tra sự tương tác có thể được thực hiện bằng cách tính toán sự khác biệt về độ lệch so với mô hình đầy đủ ở trên và mô hình rút gọn (bỏ qua thuật ngữ tương tác, đó là hai cột cuối cùng của ma trận thiết kế). Điều này có thể được thực hiện thủ công hoặc sử dụng lratiotest
chức năng cung cấp thử nghiệm giả thuyết tỷ lệ khả năng. Độ lệch cho mô hình đầy đủ là 4.3122 ( dev
), trong khi đối với mô hình không có tương tác là 6.4200 (tôi đã sử dụng glmfit(X(:,1:3), [y n], 'binomial', 'link', 'probit');
) và thử nghiệm LR liên quan có hai bậc tự do (sự khác biệt về số lượng tham số giữa hai mô hình). Vì độ lệch tỷ lệ chỉ gấp hai lần khả năng đăng nhập của GLM, chúng tôi có thể sử dụng
[H, pValue, Ratio, CriticalValue] = lratiotest(4.3122/2, 6.4200/2, 2)
trong đó thống kê được phân phối dưới dạng với 2 df (giá trị tới hạn là 5,9915, xem ). Đầu ra chỉ ra một kết quả không đáng kể: Chúng ta không thể kết luận về sự tồn tại của sự tương tác giữa và trong mẫu được quan sát.χ2chi2inv(0.95, 2)
x
g
Tôi đoán bạn có thể kết thúc các bước trên trong một chức năng thuận tiện theo lựa chọn của bạn. (Lưu ý rằng kiểm tra LR có thể được thực hiện bằng tay trong rất ít lệnh!)
Tôi đã kiểm tra những kết quả này so với đầu ra R, được đưa ra tiếp theo.
Đây là mã R:
x <- c(2100,2300,2500,2700,2900,3100,3300,3500,3700,3900,4100,4300)
g <- gl(3, 4)
n <- c(48,42,31,34,31,21,23,23,21,16,17,21)
y <- c(1,2,0,3,8,8,14,17,19,15,17,21)
f <- cbind(y, n-y) ~ x*g
model.matrix(f) # will be model.frame() for glm()
m1 <- glm(f, family=binomial("probit"))
summary(m1)
Dưới đây là kết quả, cho các hệ số trong mô hình đầy đủ,
Call:
glm(formula = f, family = binomial("probit"))
Deviance Residuals:
Min 1Q Median 3Q Max
-1.7124 -0.1192 0.1494 0.3036 0.5585
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -3.892859 2.025096 -1.922 0.0546 .
x 0.000884 0.000829 1.066 0.2863
g2 -3.212494 2.762155 -1.163 0.2448
g3 -5.774400 7.553615 -0.764 0.4446
x:g2 0.001335 0.001017 1.312 0.1894
x:g3 0.002061 0.002086 0.988 0.3230
Để so sánh hai mô hình lồng nhau, tôi đã sử dụng các lệnh sau:
m0 <- update(m1, . ~ . -x:g)
anova(m1,m0)
trong đó mang lại "bảng lệch lạc" sau:
Analysis of Deviance Table
Model 1: cbind(y, n - y) ~ x + g
Model 2: cbind(y, n - y) ~ x * g
Resid. Df Resid. Dev Df Deviance
1 8 6.4200
2 6 4.3122 2 2.1078