Hướng dẫn unbalanced anova python - con trăn anova không cân bằng

RENESH BEDRE & NBSP; & NBSP; 16 phút đọc16 minute read

Hướng dẫn unbalanced anova python - con trăn anova không cân bằng

ANOVA (phân tích phương sai) là gì?

  • Thử nghiệm ANOVA được sử dụng để so sánh phương tiện của hơn 2 nhóm (kiểm tra t hoặc kiểm tra Z có thể được sử dụng để so sánh 2 nhóm)
  • Các nhóm có nghĩa là sự khác biệt được suy ra bằng cách phân tích phương sai
  • ANOVA sử dụng kiểm tra F dựa trên phương sai để kiểm tra bình đẳng trung bình của nhóm. Đôi khi, thử nghiệm ANOVA F còn được gọi là thử nghiệm omnibus vì nó kiểm tra giả thuyết null không đặc hiệu, tức là tất cả các phương tiện nhóm đều bằng nhau
  • Các loại chính: một chiều (một yếu tố) và hai chiều (hai yếu tố) ANOVA (yếu tố là một biến độc lập)
  • Nó cũng được gọi là ANOVA đơn biến vì chỉ có một biến phụ thuộc trong mô hình. MANOVA được sử dụng khi có nhiều biến phụ thuộc trong tập dữ liệu. Nếu có một biến độc lập liên tục bổ sung trong mô hình, thì ANCOVA được sử dụng.
  • Nếu bạn đã lặp đi lặp lại các phép đo cho các phương pháp điều trị hoặc thời gian trên cùng một đối tượng, bạn nên sử dụng phép đo lặp lại ANOVA

Lưu ý: Trong ANOVA, nhóm, các yếu tố và biến độc lập là các thuật ngữ tương tự

ANOVA Giả thuyết

  • Giả thuyết null: Các nhóm có nghĩa là bằng nhau (không có sự thay đổi về phương tiện của các nhóm)
    H0: μ1=μ2=…=μp
  • Giả thuyết thay thế: Ít nhất, một nhóm trung bình khác với nhóm khác
    H1: All μ are not equal

Giả thuyết null được kiểm tra bằng cách sử dụng thử nghiệm omnibus (thử nghiệm F) cho tất cả các nhóm, tiếp tục được kiểm tra sau đại học để thấy sự khác biệt nhóm riêng lẻ.

Tìm hiểu thêm về kiểm tra và giải thích giả thuyết

Giả định ANOVA

  • Phần dư (lỗi thử nghiệm) được phân phối xấp xỉ bình thường (kiểm tra OR SHAPIRO-LOD hoặc Biểu đồ)
  • Tính đồng nhất hoặc tính đồng nhất của các phương sai (phương sai là bằng nhau giữa các nhóm điều trị) (Levene, Bartlett, hoặc xét nghiệm màu nâu-forsythe)
  • Các quan sát được lấy mẫu độc lập với nhau (không có mối quan hệ nào trong quan sát giữa các nhóm và trong các nhóm), tức là, mỗi đối tượng chỉ nên có một phản hồi
  • Biến phụ thuộc nên liên tục. Nếu biến phụ thuộc là thứ tự hoặc thứ hạng (ví dụ: dữ liệu mục Likert), có nhiều khả năng vi phạm các giả định về tính quy tắc và tính đồng nhất của phương sai. Nếu các giả định này bị vi phạm, bạn nên xem xét các bài kiểm tra không tham số (ví dụ: thử nghiệm Mann-Whitney U, kiểm tra Kruskal-Wallis).

ANOVA là một phương pháp mạnh mẽ khi các giả định về tính quy tắc và tính đồng nhất của phương sai là hợp lệ. ANOVA ít mạnh hơn (ít ảnh hưởng đến lỗi loại I), nếu giả định về tính quy tắc bị vi phạm trong khi phương sai bằng nhau.

ANOVA hoạt động như thế nào?

  • Kiểm tra kích thước mẫu: Số lượng quan sát bằng nhau trong mỗi nhóm
  • Tính hình vuông trung bình cho mỗi nhóm (ms) (SS của nhóm/cấp 1); Cấp 1 là một mức độ tự do (DF) cho một nhóm
  • Tính toán lỗi bình phương trung bình (MSE) (lỗi SS/DF của phần dư)
  • Tính giá trị F (MS của nhóm/MSE)
  • Tính giá trị P dựa trên giá trị F và mức độ tự do (DF)

Một chiều (một yếu tố) ANOVA với Python

Mô hình hiệu ứng ANOVA, bảng và công thức

Bảng ANOVA biểu thị các nguồn biến thể giữa và trong nhóm và mức độ tự do liên quan của chúng, tổng hình vuông (SS) và bình phương trung bình (MS). Tổng biến thể là tổng của các phương sai giữa và trong nhóm. Giá trị F là tỷ lệ bình phương trung bình giữa và trong nhóm (MS). Giá trị P được ước tính từ giá trị F và mức độ tự do.

Hướng dẫn unbalanced anova python - con trăn anova không cân bằng

Ví dụ ANOVA

Dữ liệu ví dụ cho hướng dẫn phân tích ANOVA một chiều, tập dữ liệu

MộtBCD
25 45 30 54
30 55 29 60
28 29 33 51
36 56 37 62
29 40 27 73

Ở đây, có bốn phương pháp điều trị (A, B, C và D), là các nhóm để phân tích ANOVA. Phương pháp điều trị là biến độc lập và được gọi là yếu tố. Vì có bốn loại điều trị, yếu tố điều trị có bốn cấp độ.

Đối với thiết kế thử nghiệm này, chỉ có yếu tố (phương pháp điều trị) hoặc biến độc lập để đánh giá, và do đó, phương pháp ANOVA một chiều là phù hợp để phân tích.

Lưu ý: Nếu bạn có bộ dữ liệu của riêng mình, bạn nên nhập nó dưới dạng gấu trúc DataFrame. Tìm hiểu cách nhập dữ liệu bằng gấu trúc

import pandas as pd
# load data file
df = pd.read_csv("https://reneshbedre.github.io/assets/posts/anova/onewayanova.txt", sep="\t")
# reshape the d dataframe suitable for statsmodels package 
df_melt = pd.melt(df.reset_index(), id_vars=['index'], value_vars=['A', 'B', 'C', 'D'])
# replace column names
df_melt.columns = ['index', 'treatments', 'value']

# generate a boxplot to see the data distribution by treatments. Using boxplot, we can 
# easily detect the differences between different treatments
import matplotlib.pyplot as plt
import seaborn as sns
ax = sns.boxplot(x='treatments', y='value', data=df_melt, color='#99c2a2')
ax = sns.swarmplot(x="treatments", y="value", data=df_melt, color='#7d0013')
plt.show()

Hướng dẫn unbalanced anova python - con trăn anova không cân bằng

import scipy.stats as stats
# stats f_oneway functions takes the groups as input and returns ANOVA F and p value
fvalue, pvalue = stats.f_oneway(df['A'], df['B'], df['C'], df['D'])
print(fvalue, pvalue)
# 17.492810457516338 2.639241146210922e-05

# get ANOVA table as R like output
import statsmodels.api as sm
from statsmodels.formula.api import ols

# Ordinary Least Squares (OLS) model
model = ols('value ~ C(treatments)', data=df_melt).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
anova_table
# output (ANOVA F and p value)
                sum_sq    df         F    PR(>F)
C(treatments)  3010.95   3.0  17.49281  0.000026
Residual        918.00  16.0       NaN       NaN

# ANOVA table using bioinfokit v1.0.3 or later (it uses wrapper script for anova_lm)
from bioinfokit.analys import stat
res = stat()
res.anova_stat(df=df_melt, res_var='value', anova_model='value ~ C(treatments)')
res.anova_summary
# output (ANOVA F and p value)
                 df   sum_sq   mean_sq         F    PR(>F)
C(treatments)   3.0  3010.95  1003.650  17.49281  0.000026
Residual       16.0   918.00    57.375       NaN       NaN

# note: if the data is balanced (equal sample size for each group), Type 1, 2, and 3 sums of squares
# (typ parameter) will produce similar results.

Kiểm tra cách tính giá trị P bằng tay

Diễn dịch

Giá trị P thu được từ phân tích ANOVA là rất đáng kể (p <0,05), và do đó, chúng tôi kết luận rằng có sự khác biệt đáng kể giữa các phương pháp điều trị.

Lưu ý trên giá trị F: Giá trị F có liên quan nghịch đảo với giá trị P và giá trị F cao hơn (lớn hơn giá trị tới F) cho thấy giá trị P đáng kể.

Lưu ý: Nếu bạn có dữ liệu không cân bằng (kích thước mẫu không đồng đều cho mỗi nhóm), bạn có thể thực hiện các bước tương tự như được mô tả cho ANOVA một chiều với thiết kế cân bằng (cỡ mẫu bằng nhau cho mỗi nhóm).: If you have unbalanced (unequal sample size for each group) data, you can perform similar steps as described for one-way ANOVA with balanced design (equal sample size for each group).

Từ phân tích ANOVA, chúng tôi biết rằng sự khác biệt điều trị có ý nghĩa thống kê, nhưng ANOVA không cho biết phương pháp điều trị nào khác biệt đáng kể với nhau. Để biết các cặp điều trị khác nhau, chúng tôi sẽ thực hiện phân tích so sánh nhiều cặp (so sánh sau hoc) cho tất cả các so sánh không có kế hoạch bằng cách sử dụng thử nghiệm khác biệt đáng kể (HSD) của Tukey.post hoc comparison) analysis for all unplanned comparison using Tukey’s honestly significantly differenced (HSD) test.

Lưu ý: Khi ANOVA có ý nghĩa, các bài kiểm tra bài hoc được sử dụng để thấy sự khác biệt giữa các nhóm cụ thể. Kiểm tra bài hoc kiểm soát tỷ lệ lỗi theo gia đình (tỷ lệ lỗi loại I tăng cao) do nhiều so sánh. Các bài kiểm tra bài hoc điều chỉnh các giá trị p (hiệu chỉnh Bonferroni) hoặc giá trị tới hạn (kiểm tra HSD Tukey).: When the ANOVA is significant, post hoc tests are used to see differences between specific groups. post hoc tests control the family-wise error rate (inflated type I error rate) due to multiple comparisons. post hoc tests adjust the p values (Bonferroni correction) or critical value (Tukey’s HSD test).

Tukey từ HSD kiểm tra tài khoản cho nhiều so sánh và sửa chữa tỷ lệ lỗi theo gia đình (FWER) (lỗi loại I tăng cao)

Công thức Tukey và Tukey-Kramer

Hướng dẫn unbalanced anova python - con trăn anova không cân bằng

Ngoài ra, phương pháp Scheffe, hoàn toàn mạch lạc với ANOVA và được coi là bài kiểm tra bài hoc phù hợp hơn cho ANOVA đáng kể cho tất cả các so sánh không có kế hoạch. Tuy nhiên, nó rất bảo thủ so với các bài kiểm tra bài hoc khác.

# we will use bioinfokit (v1.0.3 or later) for performing tukey HSD test
# check documentation here https://github.com/reneshbedre/bioinfokit
from bioinfokit.analys import stat
# perform multiple pairwise comparison (Tukey's HSD)
# unequal sample size data, tukey_hsd uses Tukey-Kramer test
res = stat()
res.tukey_hsd(df=df_melt, res_var='value', xfac_var='treatments', anova_model='value ~ C(treatments)')
res.tukey_summary
# output
  group1 group2  Diff      Lower      Upper   q-value   p-value
0      A      B  15.4   1.692871  29.107129  4.546156  0.025070
1      A      C   1.6 -12.107129  15.307129  0.472328  0.900000
2      A      D  30.4  16.692871  44.107129  8.974231  0.001000
3      B      C  13.8   0.092871  27.507129  4.073828  0.048178
4      B      D  15.0   1.292871  28.707129  4.428074  0.029578
5      C      D  28.8  15.092871  42.507129  8.501903  0.001000

# Note: p-value 0.001 from tukey_hsd output should be interpreted as <=0.001

Kết quả trên từ Tukey, HSD cho thấy rằng ngoại trừ A-C, tất cả các so sánh theo cặp khác đối với các phương pháp điều trị đều bác bỏ giả thuyết null (p <0,05) và cho thấy sự khác biệt có ý nghĩa thống kê.

Lưu ý: Kiểm tra HSD của Tukey, là bảo thủ và tăng giá trị tới hạn để kiểm soát tỷ lệ lỗi loại I thử nghiệm (hoặc FWER). Nếu bạn có một số lượng lớn các so sánh (giả sử> 10 hoặc 20) để sử dụng bài kiểm tra Tukey, có thể có khả năng bạn không nhận được kết quả quan trọng cho tất cả các cặp hoặc dự kiến. Nếu bạn chỉ quan tâm đến các so sánh cụ thể hoặc một vài so sánh và bạn đã giành được sự khác biệt đáng kể khi sử dụng bài kiểm tra Tukey, bạn có thể chia dữ liệu để so sánh cụ thể hoặc sử dụng bài kiểm tra t: Tukey’s HSD test is conservative and increases the critical value to control the experimentwise type I error rate (or FWER). If you have a large number of comparisons (say > 10 or 20) to make using Tukey’s test, there may be chances that you may not get significant results for all or expected pairs. If you are interested in only specific or few comparisons and you won’t find significant differences using Tukey’s test, you may split the data for specific comparisons or use the t-test

Kiểm tra các giả định ANOVA

  • Các giả định ANOVA có thể được kiểm tra bằng cách sử dụng thống kê kiểm tra (ví dụ: Shapiro-Wilk, Bartlett, thử nghiệm Levene, thử nghiệm màu nâu) và các phương pháp tiếp cận trực quan như sơ đồ dư (ví dụ: các lô QQ) và biểu đồ.
  • Các phương pháp trực quan thực hiện tốt hơn các bài kiểm tra thống kê. Ví dụ, thử nghiệm Shapiro-Wilk có công suất thấp cho dữ liệu kích thước mẫu nhỏ và lệch đáng kể so với tính quy tắc đối với kích thước mẫu lớn (nói N> 50). Đối với kích thước mẫu lớn, bạn nên xem xét sử dụng bản đồ QQ cho giả định tính quy tắc.

Bây giờ, tôi sẽ tạo ra lỗi QQ từ phần dư được tiêu chuẩn hóa (các ngoại lệ có thể dễ dàng được phát hiện từ phần dư được tiêu chuẩn hóa so với dư bình thường)

# QQ-plot
import statsmodels.api as sm
import matplotlib.pyplot as plt
# res.anova_std_residuals are standardized residuals obtained from ANOVA (check above)
sm.qqplot(res.anova_std_residuals, line='45')
plt.xlabel("Theoretical Quantiles")
plt.ylabel("Standardized Residuals")
plt.show()

# histogram
plt.hist(res.anova_model_out.resid, bins='auto', histtype='bar', ec='k') 
plt.xlabel("Residuals")
plt.ylabel('Frequency')
plt.show()

Hướng dẫn unbalanced anova python - con trăn anova không cân bằng
Hướng dẫn unbalanced anova python - con trăn anova không cân bằng

Khi các phần dư được tiêu chuẩn hóa nằm xung quanh dòng 45 độ, nó cho thấy rằng phần dư được phân phối xấp xỉ bình thường

Trong biểu đồ, phân phối trông xấp xỉ bình thường và cho thấy rằng phần dư được phân phối xấp xỉ bình thường

Thử nghiệm Shapiro-Wilk có thể được sử dụng để kiểm tra phân phối bình thường của phần dư. Giả thuyết Null: Dữ liệu được rút ra từ phân phối bình thường. can be used to check the normal distribution of residuals. Null hypothesis: data is drawn from normal distribution.

import scipy.stats as stats
w, pvalue = stats.shapiro(model.resid)
print(w, pvalue)
# 0.9685019850730896 0.7229772806167603

Vì giá trị P không có ý nghĩa, chúng tôi không từ chối giả thuyết null và kết luận rằng dữ liệu được rút ra từ phân phối bình thường.

Khi dữ liệu được rút ra từ phân phối bình thường, hãy sử dụng thử nghiệm Bartlett, để kiểm tra tính đồng nhất của phương sai. Giả thuyết null: Các mẫu từ quần thể có phương sai như nhau.Homogeneity of variances. Null hypothesis: samples from populations have equal variances.

import scipy.stats as stats
w, pvalue = stats.bartlett(df['A'], df['B'], df['C'], df['D'])
print(w, pvalue)
5.687843565012841 0.1278253399753447

# if you have a stacked table, you can use bioinfokit v1.0.3 or later for the bartlett's test
from bioinfokit.analys import stat 
res = stat()
res.bartlett(df=df_melt, res_var='value', xfac_var='treatments')
res.bartlett_summary
# output
                 Parameter   Value
0      Test statistics (T)  5.6878
1  Degrees of freedom (Df)  3.0000
2                  p value  0.1278

Vì giá trị p (0,12) là không có ý nghĩa, chúng tôi không bác bỏ giả thuyết null và kết luận rằng các phương pháp điều trị có phương sai như nhau.

Thử nghiệm Levene sườn có thể được sử dụng để kiểm tra tính đồng nhất của phương sai khi dữ liệu không được rút ra từ phân phối bình thường. can be used to check the Homogeneity of variances when the data is not drawn from normal distribution.

# if you have a stacked table, you can use bioinfokit v1.0.3 or later for the Levene's test
from bioinfokit.analys import stat 
res = stat()
res.levene(df=df_melt, res_var='value', xfac_var='treatments')
res.levene_summary
# output
                 Parameter   Value
0      Test statistics (W)  1.9220
1  Degrees of freedom (Df)  3.0000
2                  p value  0.1667

Hai chiều (hai yếu tố) ANOVA (thiết kế giai thừa) với Python

Ở đây, tôi sẽ thảo luận về ANOVA độc lập hai chiều, khác với ANOVA hỗn hợp hai chiều và ANOVA đo lặp lại.

Mô hình hiệu ứng nhân tố ANOVA, bảng và công thức

Hướng dẫn unbalanced anova python - con trăn anova không cân bằng

Dữ liệu ví dụ cho hướng dẫn phân tích ANOVA hai chiều, tập dữ liệu

Từ bộ dữ liệu, có hai yếu tố (biến độc lập) viz. Kiểu gen và năng suất trong năm. Kiểu gen và năm có sáu và ba cấp độ tương ứng (xem ANOVA một chiều để biết các yếu tố và cấp độ).

Đối với thiết kế thử nghiệm này, có hai yếu tố để đánh giá, và do đó, phương pháp ANOVA hai chiều phù hợp để phân tích. Ở đây, sử dụng ANOVA hai chiều, chúng ta có thể đồng thời đánh giá cách loại kiểu gen và năm ảnh hưởng đến sản lượng của thực vật. Nếu bạn áp dụng ANOVA một chiều ở đây, bạn chỉ có thể đánh giá một yếu tố tại một thời điểm.

Từ ANOVA hai chiều, chúng ta có thể kiểm tra ba giả thuyết 1) ảnh hưởng của kiểu gen đến năng suất 2) ảnh hưởng của thời gian (năm) đến năng suất và 3) ảnh hưởng của kiểu gen và thời gian (năm)

Lưu ý: Nếu bạn có bộ dữ liệu của riêng mình, bạn nên nhập nó dưới dạng gấu trúc DataFrame. Tìm hiểu cách nhập dữ liệu bằng gấu trúc

import pandas as pd
import seaborn as sns
# load data file
d = pd.read_csv("https://reneshbedre.github.io/assets/posts/anova/twowayanova.txt", sep="\t")
# reshape the d dataframe suitable for statsmodels package 
# you do not need to reshape if your data is already in stacked format. Compare d and d_melt tables for detail 
# understanding 
d_melt = pd.melt(d, id_vars=['Genotype'], value_vars=['1_year', '2_year', '3_year'])
# replace column names
d_melt.columns = ['Genotype', 'years', 'value']
d_melt.head()
# output
  Genotype   years  value
0        A  1_year   1.53
1        A  1_year   1.83
2        A  1_year   1.38
3        B  1_year   3.60
4        B  1_year   2.94

Vì có 6 và 3 cấp độ cho kiểu gen và năm, tương ứng, đây là thiết kế giai thừa 6 x 3 mang lại 18 kết hợp độc đáo để đo biến phản ứng.

# generate a boxplot to see the data distribution by genotypes and years. Using boxplot, we can easily detect the 
# differences between different groups
sns.boxplot(x="Genotype", y="value", hue="years", data=d_melt, palette="Set3") 

Hướng dẫn unbalanced anova python - con trăn anova không cân bằng

import statsmodels.api as sm
from statsmodels.formula.api import ols
model = ols('value ~ C(Genotype) + C(years) + C(Genotype):C(years)', data=d_melt).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
anova_table
# output
                          sum_sq    df           F        PR(>F)
C(Genotype)            58.551733   5.0   32.748581  1.931655e-12
C(years)              278.925633   2.0  390.014868  4.006243e-25
C(Genotype):C(years)   17.122967  10.0    4.788525  2.230094e-04
Residual               12.873000  36.0         NaN           NaN

# ANOVA table using bioinfokit v1.0.3 or later (it uses wrapper script for anova_lm)
from bioinfokit.analys import stat
res = stat()
res.anova_stat(df=d_melt, res_var='value', anova_model='value~C(Genotype)+C(years)+C(Genotype):C(years)')
res.anova_summary
# output
                        df      sum_sq     mean_sq           F        PR(>F)
C(Genotype)            5.0   58.551733   11.710347   32.748581  1.931655e-12
C(years)               2.0  278.925633  139.462817  390.014868  4.006243e-25
C(Genotype):C(years)  10.0   17.122967    1.712297    4.788525  2.230094e-04
Residual              36.0   12.873000    0.357583         NaN           NaN

Lưu ý: Nếu bạn có dữ liệu không cân bằng (kích thước mẫu không đồng đều cho mỗi nhóm), bạn có thể thực hiện các bước tương tự như được mô tả cho ANOVA hai chiều với thiết kế cân bằng nhưng đặt `typ = 3`. Tổng số 3 của hình vuông (SS) không giả định kích thước mẫu bằng nhau giữa các nhóm và được khuyến nghị cho một thiết kế không cân bằng cho ANOVA đa yếu tố.: If you have unbalanced (unequal sample size for each group) data, you can perform similar steps as described for two-way ANOVA with the balanced design but set `typ=3`. Type 3 sums of squares (SS) does not assume equal sample sizes among the groups and is recommended for an unbalanced design for multifactorial ANOVA.

Diễn dịch

Giá trị P thu được từ phân tích ANOVA cho kiểu gen, năm và tương tác có ý nghĩa thống kê (P

Vì sự tương tác rất có ý nghĩa, hãy để trực quan hóa biểu đồ tương tác (còn gọi là biểu đồ hồ sơ) cho các hiệu ứng tương tác,

import scipy.stats as stats
# stats f_oneway functions takes the groups as input and returns ANOVA F and p value
fvalue, pvalue = stats.f_oneway(df['A'], df['B'], df['C'], df['D'])
print(fvalue, pvalue)
# 17.492810457516338 2.639241146210922e-05

# get ANOVA table as R like output
import statsmodels.api as sm
from statsmodels.formula.api import ols

# Ordinary Least Squares (OLS) model
model = ols('value ~ C(treatments)', data=df_melt).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
anova_table
# output (ANOVA F and p value)
                sum_sq    df         F    PR(>F)
C(treatments)  3010.95   3.0  17.49281  0.000026
Residual        918.00  16.0       NaN       NaN

# ANOVA table using bioinfokit v1.0.3 or later (it uses wrapper script for anova_lm)
from bioinfokit.analys import stat
res = stat()
res.anova_stat(df=df_melt, res_var='value', anova_model='value ~ C(treatments)')
res.anova_summary
# output (ANOVA F and p value)
                 df   sum_sq   mean_sq         F    PR(>F)
C(treatments)   3.0  3010.95  1003.650  17.49281  0.000026
Residual       16.0   918.00    57.375       NaN       NaN

# note: if the data is balanced (equal sample size for each group), Type 1, 2, and 3 sums of squares
# (typ parameter) will produce similar results.
0

Hướng dẫn unbalanced anova python - con trăn anova không cân bằng

  • Biểu đồ tương tác giúp hình dung các phương tiện phản ứng của hai yếu tố (kiểu gen và năm) trên một biểu đồ. Nói chung, trục x nên có một yếu tố với nhiều cấp độ hơn.
  • Từ biểu đồ tương tác, hiệu ứng tương tác có ý nghĩa giữa kiểu gen và năm vì ba dòng không song song (các dòng yếu tố gần như song song cho thấy không có tương tác - mô hình phụ gia). Tương tác này cũng được gọi là tương tác thứ tự vì các dòng không đi qua nhau.
  • Để có kết luận đáng tin cậy hơn về biểu đồ tương tác, nó cần được xác minh bằng thử nghiệm F để tương tác

So sánh nhiều cặp (bài kiểm tra sau hoc)

Bây giờ, chúng ta biết rằng sự khác biệt về kiểu gen và thời gian (năm) có ý nghĩa thống kê, nhưng ANOVA không cho biết kiểu gen và thời gian (năm) khác nhau đáng kể với nhau. Để biết các cặp kiểu gen và thời gian khác nhau đáng kể (năm), thực hiện phân tích so sánh nhiều cặp (so sánh sau đại học) bằng cách sử dụng thử nghiệm HSD Tukey.Post-hoc comparison) analysis using Tukey’s HSD test.

import scipy.stats as stats
# stats f_oneway functions takes the groups as input and returns ANOVA F and p value
fvalue, pvalue = stats.f_oneway(df['A'], df['B'], df['C'], df['D'])
print(fvalue, pvalue)
# 17.492810457516338 2.639241146210922e-05

# get ANOVA table as R like output
import statsmodels.api as sm
from statsmodels.formula.api import ols

# Ordinary Least Squares (OLS) model
model = ols('value ~ C(treatments)', data=df_melt).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
anova_table
# output (ANOVA F and p value)
                sum_sq    df         F    PR(>F)
C(treatments)  3010.95   3.0  17.49281  0.000026
Residual        918.00  16.0       NaN       NaN

# ANOVA table using bioinfokit v1.0.3 or later (it uses wrapper script for anova_lm)
from bioinfokit.analys import stat
res = stat()
res.anova_stat(df=df_melt, res_var='value', anova_model='value ~ C(treatments)')
res.anova_summary
# output (ANOVA F and p value)
                 df   sum_sq   mean_sq         F    PR(>F)
C(treatments)   3.0  3010.95  1003.650  17.49281  0.000026
Residual       16.0   918.00    57.375       NaN       NaN

# note: if the data is balanced (equal sample size for each group), Type 1, 2, and 3 sums of squares
# (typ parameter) will produce similar results.
1

Kiểm tra các giả định ANOVA

Tương tự như ANOVA một chiều, bạn có thể sử dụng các phương pháp trực quan, Bartlett, hoặc Levene, và thử nghiệm Shapiro-Wilk để xác nhận các giả định về tính đồng nhất của phương sai và phân phối bình thường của phần dư.Bartlett’s or Levene’s, and Shapiro-Wilk test to validate the assumptions for homogeneity of variances and normal distribution of residuals.

import scipy.stats as stats
# stats f_oneway functions takes the groups as input and returns ANOVA F and p value
fvalue, pvalue = stats.f_oneway(df['A'], df['B'], df['C'], df['D'])
print(fvalue, pvalue)
# 17.492810457516338 2.639241146210922e-05

# get ANOVA table as R like output
import statsmodels.api as sm
from statsmodels.formula.api import ols

# Ordinary Least Squares (OLS) model
model = ols('value ~ C(treatments)', data=df_melt).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
anova_table
# output (ANOVA F and p value)
                sum_sq    df         F    PR(>F)
C(treatments)  3010.95   3.0  17.49281  0.000026
Residual        918.00  16.0       NaN       NaN

# ANOVA table using bioinfokit v1.0.3 or later (it uses wrapper script for anova_lm)
from bioinfokit.analys import stat
res = stat()
res.anova_stat(df=df_melt, res_var='value', anova_model='value ~ C(treatments)')
res.anova_summary
# output (ANOVA F and p value)
                 df   sum_sq   mean_sq         F    PR(>F)
C(treatments)   3.0  3010.95  1003.650  17.49281  0.000026
Residual       16.0   918.00    57.375       NaN       NaN

# note: if the data is balanced (equal sample size for each group), Type 1, 2, and 3 sums of squares
# (typ parameter) will produce similar results.
2

Mặc dù chúng tôi đã từ chối số liệu thống kê thử nghiệm Shapiro-Wilk (p <0,05), chúng tôi nên tìm kiếm thêm các ô và biểu đồ còn lại. Trong biểu đồ dư, phần dư được tiêu chuẩn hóa nằm xung quanh dòng 45 độ, nó cho thấy rằng phần dư được phân phối xấp xỉ bình thường. Bên cạnh đó, biểu đồ cho thấy sự phân phối khoảng bình thường của phần dư.

Hướng dẫn unbalanced anova python - con trăn anova không cân bằng
Hướng dẫn unbalanced anova python - con trăn anova không cân bằng

Lưu ý: Mô hình ANOVA rất mạnh mẽ đối với việc vi phạm giả định tính quy tắc, điều đó có nghĩa là nó sẽ có tác động không đáng kể đến tỷ lệ lỗi loại I và giá trị p sẽ vẫn đáng tin cậy miễn là không có ngoại lệ nào: The ANOVA model is remarkably robust to the violation of normality assumption, which means that it will have a non-significant effect on Type I error rate and p values will remain reliable as long as there are no outliers

Chúng tôi sẽ sử dụng thử nghiệm Levene, để kiểm tra giả định về tính đồng nhất của phương sai,

import scipy.stats as stats
# stats f_oneway functions takes the groups as input and returns ANOVA F and p value
fvalue, pvalue = stats.f_oneway(df['A'], df['B'], df['C'], df['D'])
print(fvalue, pvalue)
# 17.492810457516338 2.639241146210922e-05

# get ANOVA table as R like output
import statsmodels.api as sm
from statsmodels.formula.api import ols

# Ordinary Least Squares (OLS) model
model = ols('value ~ C(treatments)', data=df_melt).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
anova_table
# output (ANOVA F and p value)
                sum_sq    df         F    PR(>F)
C(treatments)  3010.95   3.0  17.49281  0.000026
Residual        918.00  16.0       NaN       NaN

# ANOVA table using bioinfokit v1.0.3 or later (it uses wrapper script for anova_lm)
from bioinfokit.analys import stat
res = stat()
res.anova_stat(df=df_melt, res_var='value', anova_model='value ~ C(treatments)')
res.anova_summary
# output (ANOVA F and p value)
                 df   sum_sq   mean_sq         F    PR(>F)
C(treatments)   3.0  3010.95  1003.650  17.49281  0.000026
Residual       16.0   918.00    57.375       NaN       NaN

# note: if the data is balanced (equal sample size for each group), Type 1, 2, and 3 sums of squares
# (typ parameter) will produce similar results.
3

Vì giá trị P (0,09) là không đáng kể, chúng tôi không từ chối giả thuyết khống và kết luận rằng các phương pháp điều trị có phương sai như nhau.

Nâng cao kỹ năng của bạn với các khóa học trên ANOVA

  • Thống kê với chuyên môn Python
  • ANOVA và thiết kế thử nghiệm
  • Thống kê suy luận
  • Thống kê nâng cao về chuyên môn khoa học dữ liệu
  • Công bố số liệu thống kê

Người giới thiệu

  • Seabold, Skipper và Josef Perktold. StatSmodels: Mô hình hóa kinh tế lượng và thống kê với Python. Kỷ yếu của Python thứ 9 trong Hội nghị Khoa học. 2010.
  • Virtanen P, Gommers R, Oliphant TE, Haberland M, Reddy T, Cournapeau D, Burovski E, Peterson P, Weckesser W, Bright J, van der Walt SJ. SCIPY 1.0: Các thuật toán cơ bản cho điện toán khoa học trong Python. Phương pháp tự nhiên. 2020 tháng 3; 17 (3): 261-72.
  • Mangiafico, S.S. 2015. Một người bạn đồng hành cho Sổ tay Thống kê Sinh học, Phiên bản 1.3.2.
  • Knief U, Forstmeier W. Vi phạm giả định bình thường có thể là ít hơn trong hai tệ nạn. Biorxiv. 2018 1 tháng 1: 498931.
  • Kozak M, Piepho HP. Dù sao thì điều gì bình thường? Các lô còn lại là nhiều hơn so với các thử nghiệm quan trọng khi kiểm tra các giả định ANOVA. Tạp chí nông học và khoa học cây trồng. 2018 tháng 2; 204 (1): 86-98.
  • Ruxton GD, Beauchamp G. Thời gian cho một số người nghĩ về thử nghiệm bài hoc. Sinh thái học hành vi. 2008 ngày 1 tháng 5; 19 (3): 690-3.
  • Màu nâu thử nghiệm cho sự bình đẳng của phương tiện trong r
  • Thử nghiệm Friedman bằng R (với ví dụ và mã)
  • ANOVA hỗn hợp sử dụng Python và R (với các ví dụ)
  • Các biện pháp lặp đi lặp lại ANOVA bằng Python và R (với các ví dụ)
  • ANCOVA sử dụng R (với các ví dụ và mã)
  • Nhiều vấn đề kiểm tra giả thuyết trong tin sinh học

Nếu bạn có bất kỳ câu hỏi, nhận xét, sửa chữa hoặc đề xuất nào, vui lòng gửi email cho tôi tại

Nếu bạn nâng cao kiến ​​thức và kỹ năng thực tế từ bài viết này, hãy xem xét hỗ trợ tôi

Hướng dẫn unbalanced anova python - con trăn anova không cân bằng

Công việc này được cấp phép theo giấy phép Creative Commons Attribution 4.0 quốc tế

Một số liên kết trên trang này có thể là các liên kết liên kết, điều đó có nghĩa là chúng tôi có thể nhận được một khoản hoa hồng liên kết khi mua hàng hợp lệ. Các nhà bán lẻ sẽ trả tiền hoa hồng mà không phải trả thêm chi phí cho bạn.