R&SPSS重復測量方差分析


 

最近在做重復測量方差分析,真的是走了很多彎路,足足花費了我兩周的時間,因此在此寫一篇博文,希望能給其他人提供一些參考。
先說建議:
建議使用SPSS,不要使用R,會省很多精力,我用R做了3天,失敗了,然后改用SPSS,花了1天就搞定,一方面是因為SPSS確實對用戶很友好,而且很簡單,另一方面也是因為SPSS有很多的教程,照着用就行了,很方便。
接下來,我首先介紹我的項目背景吧,我是獲得了某月一個城市的車輛數隨時間的變化情況,然后我希望比較各天的車輛數有沒有顯著性差異,所以就做了方差分析。
數據類似於下面這樣(部分):
在這里插入圖片描述
其中‘周x’是一個組間因素,因為每個樣本只會做一個處理(這邊的樣本就是該城市運行的車輛),然后時間(7:00-7:15這些)就是組內因素,因為每個樣本都在兩個或兩個以上的處理下進行了測量,這就是一個十分典型的重復測量方差分析了,然后我這邊各個處理的樣例數目是不一樣的,因此說,我做的是非均衡重復測量方差分析。
前期介紹就到這里啦,如果對重復測量方差分析還有疑問的可以網上查一下,其中對於組間因素和組內因素我參考的是這篇文章:https://wenku.baidu.com/view/d17dc3130b4e767f5acfce33.html
然后結合R語言實戰中的方差分析一章節基本搞懂了。
先說明下重復測量方差分析要滿足的假設:
使用兩因素重復測量方差分析(Two-way Repeated Measures Anova)進行分析時,需要考慮5個假設。
假設1:因變量唯一,且為連續變量;
假設2:有兩個受試者內因素(Within-Subject Factor),每個受試者內因素有2個或以上的水平。
注:在重復測量的方差分析模型中,對同一個體相同變量的不同次觀測結果被視為一組,用於區分重復測量次數的變量被稱為受試者內因素,受試者內因素實際上是自變量。
對數據的假設:
假設3:受試者內因素的各個水平,因變量沒有極端異常值;
假設4:受試者內因素的各個水平,因變量需服從近似正態分布;
假設5:對於受試者內因素的各個水平組合而言,因變量的方差協方差矩陣相等,也稱為球形假設。

摘自——https://mp.weixin.qq.com/s?__biz=MzI2OTQyMzc5MA==&mid=2247488797&idx=1&sn=34f6d5c3dabf2988b7b85071ebd312f3&chksm=eae1d0dcdd9659ca501644823def4d9d40777939813a381f50f6c1a117863ca6f7eb89bae289&scene=21#wechat_redirect
然后說一下用R做的過程中踩過的一些吭吧:
1、R語言的資料真的很少,所以我基本上都是參考R語言實戰來做的,在重復測量方差分析一節直接講了怎么做重復測量方差分析,但是並沒有對數據進行檢驗,重復測量方差分析一下子就成功做出來了,很簡單,但是我看方差分析都是要做檢驗的,所以我就去網上搜檢驗的方法。(詳見前述的5個假設)
2、知道了要做這些假設后,基本也就明白了最關鍵的就是球形假設了,而球形假設最常見的就是使用mauchly test,但是網上搜啊搜,就是沒搜到這方面的資料,非常尷尬,沒辦法,只好直接上R的官方文檔了,網址如下:
https://www.rdocumentation.org/packages/stats/versions/3.4.1/topics/mauchly.test
然后要看懂這個還需要以下一些文檔:
https://www.rdocumentation.org/packages/stats/versions/3.4.1/topics/SSD
https://www.rdocumentation.org/packages/stats/versions/3.4.1/topics/mauchly.test
由於不是學統計的,對立面的一些術語也不是很理解,所以只有依靠官方給的例子了:

# Lifted from Baron+Li:
# "Notes on the use of R for psychology experiments and questionnaires"
# Maxwell and Delaney, p. 497
reacttime <- matrix(c(
420, 420, 480, 480, 600, 780,
420, 480, 480, 360, 480, 600,
480, 480, 540, 660, 780, 780,
420, 540, 540, 480, 780, 900,
540, 660, 540, 480, 660, 720,
360, 420, 360, 360, 480, 540,
480, 480, 600, 540, 720, 840,
480, 600, 660, 540, 720, 900,
540, 600, 540, 480, 720, 780,
480, 420, 540, 540, 660, 780),
ncol = 6, byrow = TRUE,
dimnames = list(subj = 1:10,
              cond = c("deg0NA", "deg4NA", "deg8NA",
                       "deg0NP", "deg4NP", "deg8NP")))

mlmfit <- lm(reacttime ~ 1)
summary(mlmfit)
SSD(mlmfit)
$SSD
        cond
cond     deg0NA deg4NA deg8NA deg0NP deg4NP deg8NP
  deg0NA  29160  30600  26640  23760  32400  25560
  deg4NA  30600  66600  32400   7200  36000  30600
  deg8NA  26640  32400  56160  41040  57600  69840
  deg0NP  23760   7200  41040  70560  72000  63360
  deg4NP  32400  36000  57600  72000 108000 100800
  deg8NP  25560  30600  69840  63360 100800 122760

$call
lm(formula = reacttime ~ 1)

$df
[1] 9

attr(,"class")
[1] "SSD"

estVar(mlmfit)
        cond
cond     deg0NA deg4NA deg8NA deg0NP deg4NP deg8NP
  deg0NA   3240   3400   2960   2640   3600   2840
  deg4NA   3400   7400   3600    800   4000   3400
  deg8NA   2960   3600   6240   4560   6400   7760
  deg0NP   2640    800   4560   7840   8000   7040
  deg4NP   3600   4000   6400   8000  12000  11200
  deg8NP   2840   3400   7760   7040  11200  13640

### traditional test of intrasubj. contrasts
mauchly.test(mlmfit, X = ~1)

    Mauchly's test of sphericity
    Contrasts orthogonal to
    ~1'


data: SSD matrix from lm(formula = reacttime ~ 1)
W = 0.031084, p-value = 0.04765

### tests using intra-subject 3x2 design
idata <- data.frame(deg = gl(3, 1, 6, labels = c(0,4,8)),
                  noise = gl(2, 3, 6, labels = c("A","P")))
mauchly.test(mlmfit, X = ~ deg + noise, idata = idata)

    Mauchly's test of sphericity
    Contrasts orthogonal to
    ~deg + noise'


data:  SSD matrix from lm(formula = reacttime ~ 1)
W = 0.89378, p-value = 0.6381
mauchly.test(mlmfit, M = ~ deg + noise, X = ~ noise, idata = idata)

    Mauchly's test of sphericity
    Contrasts orthogonal to
    ~noise

    Contrasts spanned by
    ~deg + noise'


data:  SSD matrix from lm(formula = reacttime ~ 1)
W = 0.96011, p-value = 0.8497

簡單說明下其中的一些東西吧,輸入一個矩陣,一列是一個sample,做一個線性回歸,但是這個線性回歸~1,其實就是求每一列的均值,形成一個object mlmfit,SSD()函數就是求出一個矩陣,名字叫這玩意:The residual sums of squares and products matrix,我自己翻譯為“殘差平方和-積和矩陣”也不知對不對,不好意思,沒學過這玩意。
estVar(mlmfit)這個函數其實就是求出協方差矩陣啦!然后就可以做球形檢驗了。
我基本上就是做到這一步,之后就沒再做下去了,因為我發現我的例子中不滿足球形假設,因此實際上需要做出調整,但是R語言沒有給出調整后的值,所以如果堅持要使用R,還需要花費很多時間,所以就放棄了,改用SPSS,因為SPSS可以直接給出球形檢驗的結果和調整值,十分簡單方便。
SPSS的使用在此就不介紹了,因為網上介紹很多很多了,這里推薦兩個,寫的很好,很完整,大家自己去看大佬寫的東西吧:
https://www.sohu.com/a/123940962_489312
https://mp.weixin.qq.com/s?__biz=MzI2OTQyMzc5MA==&mid=2247488797&idx=1&sn=34f6d5c3dabf2988b7b85071ebd312f3&chksm=eae1d0dcdd9659ca501644823def4d9d40777939813a381f50f6c1a117863ca6f7eb89bae289&scene=21#wechat_redirect
不過,用spss我還是遇到了一個坑,在此提醒大家注意下:
如果重復檢測次數過多,也就是組內因素time設的過多時,球形檢驗那一項的sig會是空的,因為無法計算出來。原因是自由度太多了,但是給的樣例又太少了,這樣就無法計算出結果,遇到這個問題時,需要減少time的檢測次數,或是增加樣例數,但是一般增加樣例數比較難,所以就減少重復檢測次數就行啦,然后就可以成功計算出球形檢驗值啦!
其他應該沒什么需要注意的了,希望大家一切順利。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM