簡體   English   中英

R 中 lsmeans 和 SE 計算中的錯誤自由度

[英]Wrong degrees of freedom in lsmeans and SE calculation in R

我有這個示例數據:

Sample  Replication Days

    1   1   10
    1   1   14
    1   1   13
    1   1   14
    2   1   NA
    2   1   5
    2   1   18
    2   1   20
    1   2   16
    1   2   NA
    1   2   18
    1   2   21
    2   2   15
    2   2   7
    2   2   12
    2   2   14

我對每個樣本有四個觀察結果,在兩次重復中的每一個中總共有 64 個樣本。 我總共有 512 個復制值。 我也有一些缺失值指定為“NA”。 我對我使用生成的每個代表的每個樣本的平均值進行了方差分析

library(tidyverse)
df <- Data %>% group_by(Sample, Rep) %>% summarise(Mean = mean(Days, na.rm = TRUE)) 
curve.anova <- aov(Mean~Rep+Sample, data=df)

方差分析的結果是:

> summary(curve.anova) 
            Df Sum Sq Mean Sq F value Pr(>F)    
Rep          1    6.1   6.071   2.951 0.0915 .  
Sample        63 1760.5  27.945  13.585 <2e-16 ***
Residuals   54  111.1   2.057 

我為平均值和 SE 值創建了一個表格,

ANOVA<-lsmeans(curve.anova, ~Sample)
ANOVA<-summary(ANOVA)
write.csv(ANOVA, file="Desktop/ANOVA.csv")

文件中的幾行是:

Sample  lsmean  SE  df  lower.CL    upper.CL
1       24.875  1.014145417 54  22.84176086 26.90823914
2       25.5    1.014145417 54  23.46676086 27.53323914
3       31.32575758 1.440722628 54  28.43728262 34.21423253
4       26.375  1.014145417 54  24.34176086 28.40823914
5       26.42424242 1.440722628 54  23.53576747 29.31271738
6       25.5    1.014145417 54  23.46676086 27.53323914
7       28.375  1.014145417 54  26.34176086 30.40823914
8       24.875  1.014145417 54  22.84176086 26.90823914
9       21.16666667 1.014145417 54  19.13342752 23.19990581
10      23.875  1.014145417 54  21.84176086 25.90823914

所有 64 個樣本的 df 是 54,並且 ggplot 中的誤差線對於所有樣本幾乎都相等。 SE 值大於手動計算的值。 根據方差分析結果,df=54 用於殘差。

我想仔細檢查方差分析結果,以便它們是正確的,並且我正確生成 lsmeans 和 SE 以使用帶有置信區間誤差條的 ggplot 繪制條形圖。

我將不勝感激任何幫助。 謝謝!

閱讀您的評論后,我認為您的工作流程存在問題。 基本上,當您應用anova測試時,您是根據不同樣本的平均值進行的。 因此,在您的示例中,當您執行以下操作時:

curve.anova <- aov(Mean~Rep+Sample, data=df)

您正在比較這些值:

> df
# A tibble: 4 x 3
# Groups:   Sample [2]
  Sample Replication  Mean
   <dbl>       <dbl> <dbl>
1      1           1  12.8
2      1           2  18.3
3      2           1  14.3
4      2           2  12  

因此,基本上,您正在比較兩組,每組有兩個值。

因此,當您嘗試刪除Replication組時,您會收到錯誤消息,因為以下輸出:

df = Data %>% group_by(Sample %>% summarise(Mean = mean(Days, na.rm = TRUE)) 

就是現在:

# A tibble: 2 x 2
  Sample  Mean
   <dbl> <dbl>
1      1  15.1
2      2  13  

因此,對該數據集應用anova測試意味着您正在比較兩組各一個值。 因此,您無法計算殘差和 SE。

相反,您應該在完整數據集上執行此操作,而不必先嘗試計算平均值:

anova_data <- aov(Days~Sample+Replication, data=Data)
anova_data2 <- aov(Days~Sample, data=Data)

他們的輸出是:

> summary(anova_data)
            Df Sum Sq Mean Sq F value Pr(>F)
Sample       1  16.07  16.071   0.713  0.416
Replication  1   9.05   9.054   0.402  0.539
Residuals   11 247.80  22.528               
2 observations deleted due to missingness

> summary(anova_data2)
            Df Sum Sq Mean Sq F value Pr(>F)
Sample       1  16.07   16.07   0.751  0.403
Residuals   12 256.86   21.41               
2 observations deleted due to missingness

現在,您可以應用lsmeans

A_d = summary(lsmeans(anova_data, ~Sample))
A_d2 = summary(lsmeans(anova_data2, ~Sample))

> A_d
 Sample lsmean  SE df lower.CL upper.CL
      1   15.3 1.8 11    11.29     19.2
      2   12.9 1.8 11     8.91     16.9

Results are averaged over the levels of: Replication 
Confidence level used: 0.95 

> A_d2
 Sample lsmean   SE df lower.CL upper.CL
      1   15.1 1.75 12    11.33     19.0
      2   13.0 1.75 12     9.19     16.8

Confidence level used: 0.95 

它不會改變均值和 SE(這很好,因為這意味着您的重復是一致的,並且它們之間沒有太多的可變性),但它會降低置信區間。

因此,要繪制它,您可以:

library(ggplot2)
ggplot(A_d, aes(x=as.factor(Sample), y=lsmean)) + 
  geom_bar(stat="identity", colour="black") +
  geom_errorbar(aes(ymin = lsmean - SE, ymax = lsmean + SE), width = .5)

在此處輸入圖片說明


根據您最初的問題,如果您想檢查 ANOVA 的輸出是否正確,您可以像這樣模擬假數據:

d2 <- data.frame(Sample = c(rep(1,10), rep(2,10)),
                 Days = c(rnorm(10, mean =3), rnorm(10, mean = 8)))

然后,

curve.d2 <- aov(Days ~ Sample, data = d2)
ANOVA2 <- lsmeans(curve.d2, ~Sample)
ANOVA2 <- summary(ANOVA2)

你會得到以下輸出:

> summary(curve.d2)
            Df Sum Sq Mean Sq F value   Pr(>F)    
Sample       1 139.32  139.32   167.7 1.47e-10 ***
Residuals   18  14.96    0.83                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
> ANOVA2
 Sample lsmean    SE df lower.CL upper.CL
      1   2.62 0.288 18     2.02     3.23
      2   7.90 0.288 18     7.29     8.51

Confidence level used: 0.95 

而對於情節

ggplot(ANOVA2, aes(x=as.factor(Sample), y=lsmean)) + 
    geom_bar(stat="identity", colour="black") +
    geom_errorbar(aes(ymin = lsmean - SE, ymax = lsmean + SE), width = .5)

在此處輸入圖片說明

如您所見,我們得到d2 lsmeans接近我們最初設置的 3 和 8。 所以,我認為你的輸出是正確的。 也許您的數據沒有任何顯着差異並且 SE 的計算是相同的,因為您的數據分布是相同的。 就是這樣。

我希望這個答案對你有幫助。

數據

df = data.frame(Sample = c(rep(1,4), rep(2,4),rep(1,4), rep(2,4)),
                Replication = c(rep(1,8), rep(2,8)),
                Days = c(10,14,13,14,NA,5,18,20,16,NA,18,21,15,7,12,14))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM