Các cách khác nhau để mô hình hóa các tương tác giữa các yếu tố dự đoán liên tục và phân loại trong GAM


8

Câu hỏi sau đây được xây dựng trên các cuộc thảo luận được tìm thấy trên trang này . Đưa ra một biến trả lời y, một biến giải thích liên tục xvà một yếu tố fac, có thể định nghĩa Mô hình phụ gia chung (GAM) với sự tương tác giữa xfacsử dụng đối số by=. Theo tệp trợ giúp ?gam.models trong gói R mgcv, điều này có thể được thực hiện như sau:

gam1 <- gam(y ~ fac +s(x, by = fac), ...)

@GavinSimpson ở đây gợi ý một cách tiếp cận khác:

gam2 <- gam(y ~ fac +s(x) +s(x, by = fac, m=1), ...)

Tôi đã chơi xung quanh với một mô hình thứ ba:

gam3 <- gam(y ~ s(x, by = fac), ...)

Câu hỏi chính của tôi là: một số trong những mô hình này chỉ sai, hoặc chúng chỉ đơn giản là khác nhau? Trong trường hợp sau, sự khác biệt của họ là gì? Dựa trên ví dụ mà tôi sẽ thảo luận dưới đây, tôi nghĩ rằng tôi có thể hiểu được một số khác biệt của họ, nhưng tôi vẫn còn thiếu một cái gì đó.

Lấy ví dụ tôi sẽ sử dụng bộ dữ liệu với phổ màu cho hoa của hai loài thực vật khác nhau được đo tại các địa điểm khác nhau.

rm(list=ls())
# install.packages("RCurl")
library(RCurl) # allows accessing data from URL
df <- read.delim(text=getURL("https://raw.githubusercontent.com/marcoplebani85/datasets/master/flower_color_spectra.txt"))
library(mgcv)

Để rõ ràng, mỗi dòng trong hình trên biểu thị phổ màu trung bình được dự đoán cho từng vị trí với dạng GAM riêng biệt density~s(wl)dựa trên các mẫu ~ 10 bông hoa. Các khu vực màu xám đại diện cho 95% CI cho mỗi GAM.

Mục tiêu cuối cùng của tôi là mô hình hóa hiệu ứng (có khả năng tương tác) của Taxonbước sóng và độ wlphản xạ (được gọi là densitytrong mã và tập dữ liệu) trong khi chiếm Localitymột hiệu ứng ngẫu nhiên trong GAM hiệu ứng hỗn hợp. Hiện tại tôi sẽ không thêm phần hiệu ứng hỗn hợp vào đĩa của mình, phần này đã đủ đầy với việc cố gắng hiểu cách mô hình hóa các tương tác.

Tôi sẽ bắt đầu với cách đơn giản nhất trong ba GAM tương tác:

gam.interaction0 <- gam(density ~ s(wl, by = Taxon), data = df) 
# common intercept, different slopes
plot(gam.interaction0, pages=1)

nhập mô tả hình ảnh ở đây

summary(gam.interaction0)

Sản xuất:

Family: gaussian 
Link function: identity 

Formula:
density ~ s(wl, by = Taxon)

Parametric coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  28.3490     0.1693   167.4   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Approximate significance of smooth terms:
                      edf Ref.df     F p-value    
s(wl):TaxonSpeciesA 8.938  8.999 884.3  <2e-16 ***
s(wl):TaxonSpeciesB 8.838  8.992 325.5  <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

R-sq.(adj) =  0.523   Deviance explained = 52.4%
GCV = 284.96  Scale est. = 284.42    n = 9918

Phần tham số là giống nhau cho cả hai loài, nhưng các spline khác nhau được trang bị cho mỗi loài. Có một chút khó hiểu khi có một phần tham số trong bản tóm tắt của GAM, vốn không phải là tham số. @IsabellaGhement giải thích:

Nếu bạn nhìn vào các ô của các hiệu ứng mịn ước tính (độ mịn) tương ứng với mô hình đầu tiên của bạn, bạn sẽ nhận thấy rằng chúng nằm ở giữa không. Vì vậy, bạn cần phải 'thay đổi' những lần làm mịn đó (nếu đánh chặn ước tính là dương) hoặc xuống (nếu đánh chặn ước tính là âm) để có được các chức năng trơn tru mà bạn nghĩ là bạn đang ước tính. Nói cách khác, bạn cần thêm các đánh chặn ước tính vào độ mượt để đạt được những gì bạn thực sự muốn. Đối với mô hình đầu tiên của bạn, 'ca' được coi là giống nhau cho cả hai lần làm mịn.

Tiếp tục:

gam.interaction1 <- gam(density ~ Taxon +s(wl, by = Taxon, m=1), data = df)
plot(gam.interaction1,pages=1)

nhập mô tả hình ảnh ở đây

summary(gam.interaction1)

Cung cấp:

Family: gaussian 
Link function: identity 

Formula:
density ~ Taxon + s(wl, by = Taxon, m = 1)

Parametric coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)    40.3132     0.1482   272.0   <2e-16 ***
TaxonSpeciesB -26.0221     0.2186  -119.1   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Approximate significance of smooth terms:
                      edf Ref.df    F p-value    
s(wl):TaxonSpeciesA 7.978      8 2390  <2e-16 ***
s(wl):TaxonSpeciesB 7.965      8  879  <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

R-sq.(adj) =  0.803   Deviance explained = 80.3%
GCV = 117.89  Scale est. = 117.68    n = 9918

Bây giờ, mỗi loài cũng có ước tính tham số riêng.

Mô hình tiếp theo là mô hình mà tôi gặp khó khăn khi hiểu:

gam.interaction2 <- gam(density ~ Taxon + s(wl) + s(wl, by = Taxon,  m=1), data = df)
plot(gam.interaction2, pages=1)

nhập mô tả hình ảnh ở đây

Tôi không có ý tưởng rõ ràng về những gì các biểu đồ này đại diện.

summary(gam.interaction2)

Cung cấp:

Family: gaussian 
Link function: identity 

Formula:
density ~ Taxon + s(wl) + s(wl, by = Taxon, m = 1)

Parametric coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)    40.3132     0.1463   275.6   <2e-16 ***
TaxonSpeciesB -26.0221     0.2157  -120.6   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Approximate significance of smooth terms:
                      edf Ref.df     F p-value    
s(wl)               8.940  8.994 30.06  <2e-16 ***
s(wl):TaxonSpeciesA 8.001  8.000 11.61  <2e-16 ***
s(wl):TaxonSpeciesB 8.001  8.000 19.59  <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

R-sq.(adj) =  0.808   Deviance explained = 80.8%
GCV = 114.96  Scale est. = 114.65    n = 9918

Phần tham số của gam.interaction2tương tự như đối với gam.interaction1, nhưng bây giờ có ba ước tính cho các thuật ngữ trơn tru, mà tôi không thể giải thích.

Cảm ơn trước bất cứ ai sẽ dành thời gian để giúp tôi hiểu sự khác biệt trong ba mô hình.


2
Thật là một bài viết đẹp, Marco! Nếu bạn nhìn vào các ô của các hiệu ứng mịn ước tính (độ mịn) tương ứng với mô hình đầu tiên của bạn, bạn sẽ nhận thấy rằng chúng nằm ở giữa không. Vì vậy, bạn cần phải 'thay đổi' những lần làm mịn đó (nếu đánh chặn ước tính là dương) hoặc xuống (nếu đánh chặn ước tính là âm) để có được các chức năng trơn tru mà bạn nghĩ là bạn đang ước tính. Nói cách khác, bạn cần thêm các đánh chặn ước tính vào độ mượt để đạt được những gì bạn thực sự muốn. Đối với mô hình đầu tiên của bạn, 'ca' được coi là giống nhau cho cả hai lần làm mịn.
Isabella Ghement

1
Khi chỉ định mô hình của bạn, đối với tôi, dường như bạn sẽ có tác dụng chính đối với Taxon, hiệu ứng chính (trơn tru) cho wl và tương tác (trơn tru) giữa Taxon và wl. Liên kết đến bài đăng của Gavin Simpson cho thấy đây là cách anh ta thiết lập các mô hình loại này. Anh ta dường như cũng sử dụng cùng giá trị của k cho các hiệu ứng mượt mà trong mô hình. Thông thường, nếu bạn bao gồm một thuật ngữ tương tác giữa hai biến dự đoán, bạn cũng nên bao gồm các hiệu ứng chính cho các biến đó.
Isabella Ghement

Vì vậy, tôi sẽ loại bỏ mô hình đầu tiên của bạn, vì nó bỏ qua tác dụng chính của Taxon. Chỉ cần sử dụng đề xuất của Gavin để có được các hiệu ứng chính và hiệu ứng tương tác bạn cần (trong khi nhớ rằng các độ mịn do mô hình tạo ra được tập trung vào khoảng 0 theo mặc định và cần được 'thay đổi' lên hoặc xuống tùy thuộc vào (các) thuật ngữ chặn.
Isabella Ghement

Xin chào @IsabellaGhement và cảm ơn phản hồi của bạn. Làm thế nào bạn giải thích thực tế rằng tóm tắt (gam.interaction2) tạo ra một ước tính có ý nghĩa cho s (wl) liên quan đến từng loài nhưng cũng là một cho s (wl) không liên kết với một trong hai loài? Có phải đó là ảnh hưởng của wl đến chức năng làm mịn của y (mật độ trong trường hợp của tôi) bất kể Taxon? Là nó được tính đơn giản bằng cách phù hợp mật độ ~ s (wl)? Tôi chạy mô hình như vậy và nó ước tính một coeff tham số. rất gần với giá trị trung bình của coeff tham số. của hai loài và edf liên quan rất gần với loài s (wl) được đưa ra bởi tóm tắt (gam.interaction2).
Marco Plebani

1
Các đồng nghiệp và tôi có một bài báo (in sẵn ở đây) đi sâu vào rất nhiều chi tiết về những vấn đề này. Bạn có thể thấy rằng hữu ích cho cả việc tìm kiếm một loạt các mô hình có thể được trang bị và cách chọn trong số chúng. Đối với tôi, tôi nghĩ rằng tất cả những gì bạn cần ở đây là gam1 cộng với một cái gì đó cho SampleIDhiệu quả cộng với bạn cần phải làm gì đó về vấn đề phương sai không liên tục; Những dữ liệu này dường như không được phân phối theo điều kiện Gaussian vì giới hạn dưới.
Gavin Simpson

Câu trả lời:


1

gam1gam2vẫn ổn; chúng là những mô hình khác nhau, mặc dù chúng đang cố gắng làm điều tương tự, đó là sự trơn tru theo nhóm cụ thể của mô hình.

Hình gam1thức

y ~ f + s(x, by = f)

thực hiện điều này bằng cách ước tính một mức độ mượt mà riêng biệt cho từng cấp độ f(giả sử đó flà một yếu tố tiêu chuẩn), và thực tế, một tham số độ mịn riêng biệt cũng được ước tính cho từng mức độ mịn.

Hình gam2thức

y ~ f + s(x) + s(x, by = f, m = 1)

đạt được mục đích tương tự như gam1(của mô hình hóa các mối quan hệ suôn sẻ giữa xycho từng cấp f) nhưng nó làm như vậy bằng cách ước tính ảnh hưởng mịn toàn cầu hoặc trung bình xtrên y(các s(x)hạn) cộng với một thuật ngữ khác biệt mịn (thứ hai s(x, by = f, m = 1)hạn). Vì hình phạt ở đây là đạo hàm đầu tiên ( m = 1) for this difference smoother, it is penalising departure from a flat line, which when added to the global or average smooth term (s (x) `) phản ánh độ lệch so với hiệu ứng toàn cầu hoặc trung bình.

gam3 hình thức

y ~ s(x, by = f)

s(x, by = f)YfxYxY

Tuy nhiên, không có mô hình nào phù hợp với dữ liệu của bạn; Bây giờ bỏ qua phân phối sai cho phản hồi ( densitykhông thể phủ định và có một vấn đề không đồng nhất mà một người không phải là Gaussian familysẽ khắc phục hoặc giải quyết), bạn chưa tính đến việc phân nhóm theo hoa ( SampleIDtrong tập dữ liệu của bạn).

Nếu mục đích của bạn là mô hình Taxoncác đường cong cụ thể thì một mô hình của biểu mẫu sẽ là điểm khởi đầu:

m1 <- gam(density ~ Taxon + s(wl, by = Taxon, k = 20) + s(SampleID, bs = 're'),
          data = df, method = 'REML')

trong đó tôi đã thêm một hiệu ứng ngẫu nhiên cho SampleIDvà tăng kích thước của việc mở rộng cơ sở cho các độ Taxonmịn cụ thể.

Mô hình này m1, mô hình các quan sát xuất phát từ wlhiệu ứng mượt mà tùy thuộc vào loài ( Taxon) mà quan sát đến từ ( Taxonthuật ngữ tham số chỉ đặt giá trị trung bình densitycho mỗi loài và cần thiết như đã thảo luận ở trên), cộng với việc chặn ngẫu nhiên. Được kết hợp với nhau, các đường cong cho từng bông hoa phát sinh từ các phiên bản thay đổi của các Taxonđường cong cụ thể, với lượng dịch chuyển được đưa ra bởi việc chặn ngẫu nhiên. Mô hình này giả định rằng tất cả các cá thể có hình dạng mịn giống như được đưa ra bởi độ mịn đối với đặc biệt Taxonmà hoa riêng lẻ xuất phát.

Một phiên bản khác của mô hình này là gam2biểu mẫu từ phía trên nhưng có thêm hiệu ứng ngẫu nhiên

m2 <- gam(density ~ Taxon + s(wl) + s(wl, by = Taxon, m = 1) + s(SampleID, bs = 're'),
          data = df, method = 'REML')

Mô hình này phù hợp hơn nhưng tôi không nghĩ nó đang giải quyết vấn đề gì cả, xem bên dưới. Một điều tôi nghĩ nó gợi ý là mặc định kcó khả năng quá thấp đối với các Taxonđường cong cụ thể trong các mô hình này . Vẫn còn rất nhiều biến thể trơn tru còn sót lại mà chúng ta không mô hình hóa nếu bạn nhìn vào các ô chẩn đoán.

Mô hình này nhiều khả năng là quá hạn chế đối với dữ liệu của bạn; một số đường cong trong âm mưu của các độ mịn riêng lẻ dường như không phải là phiên bản dịch chuyển đơn giản của các Taxonđường cong trung bình. Một mô hình phức tạp hơn cũng sẽ cho phép làm mịn từng cá nhân cụ thể. Một mô hình như vậy có thể ước tính bằng cách sử dụng cơ sở tương tác trơn trufs hoặc yếu tố . Chúng tôi vẫn muốn Taxoncác đường cong cụ thể nhưng chúng tôi cũng muốn có một độ mịn riêng biệt cho từng đường cong SampleID, nhưng không giống như các đường cong bytrơn tru, tôi sẽ đề nghị rằng ban đầu bạn muốn tất cả các SampleIDđường cong đặc biệt đó có cùng độ uốn lượn. Theo nghĩa tương tự như đánh chặn ngẫu nhiên mà chúng tôi đưa vào trước đó,fs cơ sở thêm một đánh chặn ngẫu nhiên, nhưng cũng bao gồm một spline "ngẫu nhiên" (tôi sử dụng các trích dẫn sợ hãi như trong một cách giải thích Bayes của GAM, tất cả các mô hình này chỉ là các biến thể của hiệu ứng ngẫu nhiên).

Mô hình này được trang bị cho dữ liệu của bạn như

m3 <- gam(density ~ Taxon + s(wl, by = Taxon, k = 20) + s(wl, SampleID, bs = 'fs'), 
          data = df, method = 'REML')

Lưu ý rằng tôi đã tăng kở đây, trong trường hợp chúng ta cần thêm độ rung trong độ Taxonmịn đặc biệt. Chúng ta vẫn cần Taxonhiệu ứng tham số cho các lý do đã giải thích ở trên.

Mô hình đó mất nhiều thời gian để phù hợp với một lõi đơn gam()- bam()rất có thể sẽ phù hợp hơn với mô hình này vì có một số lượng lớn các hiệu ứng ngẫu nhiên ở đây.

Nếu chúng ta so sánh các mô hình này với phiên bản AIC được điều chỉnh bằng tham số độ mịn, chúng ta sẽ thấy mô hình sau này tốt hơn đáng kể như thế nào m3, được so sánh với hai mô hình kia mặc dù nó sử dụng một mức độ tự do hơn nhiều

> AIC(m1, m2, m3)
          df      AIC
m1  190.7045 67264.24
m2  192.2335 67099.28
m3 1672.7410 31474.80

Nếu chúng ta nhìn vào sự mượt mà của mô hình này, chúng ta sẽ hiểu rõ hơn về cách nó phù hợp với dữ liệu:

nhập mô tả hình ảnh ở đây

(Lưu ý điều này được tạo ra bằng cách sử draw(m3)dụng draw()chức năng từ gói gratia của tôi . Màu sắc trong ô dưới bên trái là không liên quan và không giúp đỡ ở đây.)

Mỗi SampleIDđường cong được trang bị được xây dựng từ một thuật ngữ chặn hoặc thuật ngữ tham số TaxonSpeciesBcộng với một trong hai độ Taxonmịn cụ thể, tùy thuộc vào Taxonmỗi loại SampleIDthuộc về nhau , cộng với độ SampleIDmịn của riêng nó.

Lưu ý rằng tất cả các mô hình này vẫn sai vì chúng không tính đến sự không đồng nhất; mô hình gamma hoặc Tweedie với một liên kết nhật ký sẽ là lựa chọn của tôi để tiến xa hơn. Cái gì đó như:

m4 <- gam(density ~ Taxon + s(wl, by = Taxon) + s(wl, SampleID, bs = 'fs'), 
          data = df, method = 'REML', family = tw())

Nhưng hiện tại tôi đang gặp sự cố với mô hình phù hợp này, điều này có thể cho thấy nó quá phức tạp với nhiều độ mịn đi wlkèm.

Một hình thức thay thế là sử dụng phương pháp tiếp cận nhân tố theo thứ tự, thực hiện phân rã giống ANOVA trên các mặt phẳng:

  • Taxon thuật ngữ tham số được giữ lại
  • s(wl)là một mịn sẽ đại diện cho mức tham chiếu
  • s(wl, by = Taxon)sẽ có một sự khác biệt trơn tru riêng cho từng cấp độ khác nhau. Trong trường hợp của bạn, bạn sẽ chỉ có một trong số này.

Mô hình này được trang bị như m3,

df <- transform(df, fTaxon = ordered(Taxon))
m3 <- gam(density ~ fTaxon + s(wl) + s(wl, by = fTaxon) +
            s(wl, SampleID, bs = 'fs'), 
          data = df, method = 'REML')

nhưng cách giải thích là khác nhau; đầu tiên s(wl)sẽ đề cập đến TaxonAvà sự mượt mà ngụ ý s(wl, by = fTaxon)sẽ là một sự khác biệt trơn tru giữa mịn cho TaxonAvà đó TaxonB.


Cảm ơn! Câu hỏi tiếp theo của tôi sẽ là "nhưng tại sao tóm tắt lại khác nhau cho dù một yếu tố được đặt hàng hay không?" nhưng bạn đã đánh bại tôi với nó, cảm ơn vì điều đó là tốt. Trong tập dữ liệu của tôi, mỗi loại SampleIDlà một quang phổ từ một bông hoa, mỗi hoa từ một loại cây khác nhau, vì vậy tôi không nghĩ SampleIDnên được chỉ định là ngẫu nhiên (nhưng hãy sửa tôi nếu tôi sai). Tôi thực sự đã sử dụng một mô hình tương tự như của bạn m3với Taxonyếu tố theo thứ tự, nhưng chỉ định + s(Locality, bs="re") + s(Locality, wl, bs="re")là ngẫu nhiên. Tôi sẽ xem xét các vấn đề bạn nêu về việc phân phối số dư và không đồng nhất. Chúc mừng!
Marco Plebani

Tôi vẫn sẽ bao gồm SampleIDngẫu nhiên, dữ liệu từ một bông hoa có khả năng liên quan và thay đổi nó nếu toàn bộ chức năng liên quan đến hoa, do đó, theo một nghĩa nào đó, các chức năng (làm mịn) là ngẫu nhiên. Bạn cũng có thể cần một hiệu ứng ngẫu nhiên đơn giản cho cây nếu có nhiều hoa trên mỗi cây và nhiều cây trên mỗi đơn vị nghiên cứu (sử dụng bs = 're'"trơn tru" mà tôi đã đề cập trước đó trong câu trả lời.
Gavin Simpson

Khi tôi cố gắng để phù hợp m3với family = Gamma(link = 'log')hoặc family = tw()tôi đã gặp vấn đề thực sự với mgcv không thể tìm thấy các giá trị khởi đầu tốt và các lỗi khác khiến cho mgcv bị hỏng, điều mà tôi chưa hiểu được. Chắc chắn từ dữ liệu bạn cung cấp một mô hình Gaussian là không đúng. Tôi đã nhận được một Gaussian với liên kết nhật ký để phù hợp và nó đã giúp nhưng nó cũng không nắm bắt được tất cả sự không đồng nhất.
Gavin Simpson

0

Đây là những gì Jacolien van Rij viết trong trang hướng dẫn của mình:

Cách thiết lập tương tác tùy thuộc vào loại dự đoán nhóm:

  • với yếu tố bao gồm chênh lệch đánh chặn: Group + s(Time, by=Group)
  • với hệ số theo thứ tự bao gồm chênh lệch đánh chặn và tham chiếu trơn tru: Group + s(Time) + s(Time, by=Group)
  • với dự đoán nhị phân bao gồm tham chiếu trơn tru: s(Time) + s(Time, by=IsGroupChildren)

Các biến phân loại phải được chỉ định là các yếu tố, các yếu tố được sắp xếp hoặc các yếu tố nhị phân với các hàm R thích hợp. Để hiểu cách diễn giải các kết quả đầu ra và những gì mỗi mô hình có thể và không thể cho chúng tôi biết, hãy xem trực tiếp trang hướng dẫn của Jacolien van Rij . Hướng dẫn của cô cũng giải thích làm thế nào để phù hợp với GAM hiệu ứng hỗn hợp. Để hiểu khái niệm tương tác trong ngữ cảnh của GAM, trang hướng dẫn này của Peter Laurinec cũng hữu ích. Cả hai trang đều cung cấp nhiều thông tin hơn nữa để chạy GAM chính xác trong các tình huống khác nhau.

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.