Mã hóa một sự tương tác giữa một công cụ dự đoán danh nghĩa và liên tục để hồi quy logistic trong MATLAB


8

Vì vậy, dữ liệu của chúng tôi được cấu trúc như sau:

Chúng tôi có người tham gia, mỗi người tham gia có thể được phân loại thành 3 nhóm ( G ) và với mỗi người tham gia, chúng tôi có mẫu của một biến liên tục. Và chúng tôi đang cố gắng dự đoán các giá trị là 0 hoặc 1.M A,B,CN

Làm thế nào chúng ta sẽ sử dụng MATLAB để kiểm tra sự tương tác giữa biến liên tục và biến phân loại trong việc dự đoán các giá trị này?


@ Thislstained Bạn đang sử dụng mã nào để phù hợp với hồi quy logistic của mình?
chl

@chl - Hoặc là glmfit với 'link', 'logit' hoặc mnrfit sẽ hoạt động, không có ưu tiên cụ thể nào cho cả hai.
mpacer

Tôi không nghĩ đây là một câu hỏi thống kê, nhưng là một câu hỏi lập trình, được đặt đúng hơn tại StackOverflow ...
Manoel Galdino

@Manoel như trả lời của @chl cho thấy, câu hỏi này về cơ bản là thống kê. Nếu những câu hỏi như thế này không có chủ đề, thì đó sẽ là khoảng một nửa số câu hỏi trên trang web này!
whuber

Câu trả lời:


9

Cách dễ nhất, IMO, là tự xây dựng ma trận thiết kế, vì glmfitchấ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:gg

β0+β1x+β2Ig=2+β3Ig=3+β4x×Ig=2+β5x×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 xvớ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ừ statscấ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 lratiotestchứ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)xg

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

Btw, đối với những người khác muốn sử dụng điều này, để bạn tham khảo, bạn cần chia cho -2 chứ không phải 2, nếu không nó sẽ trả về lỗi. Xem en.wikipedia.org/wiki/Deviance_%28statistic%29
mpacer

Ngoài ra, cảm ơn rất nhiều - điều này cực kỳ hữu ích cả trong sự hiểu biết của tôi về vấn đề và loại vấn đề chung mà tôi đang giải quyết :).
mpacer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.