2012-12-29 44 views
1

與barplot和dotchart(來自調查包)相似,barNest(plotrix包)旨在爲飛行中的svyby對象生成圖,還繪製置信區間。但barNest.svymean不再處理調查數據。另一種方法是在調查繪圖功能頂部繪製置信區間點圖R調查置信區間圖

library(survey) 
data(api) 
dclus1<-svydesign(id=~dnum, weights=~pw, data=apiclus1, fpc=~fpc) 
#just one variable   
a<-svyby(~api99, ~stype, dclus1, svymean) 
#several variables 
b<-svyby(~api99+api00, ~stype, dclus1, svymean) 
dotchart(b) 

雖然我不確定你會怎麼做。如果有人解決這個問題,那麼將它自動化是非常好的(通過創建一些適用於不同大小的svyby對象的代碼),甚至可以將它合併到dotchart.svystat {survey}中。這將使組間圖形比較容易得多!標準錯誤可以從b中提取或使用SE(b)。

+0

報告錯誤時,預計會提供足夠的詳細信息。代碼在我的機器上運行良好。使用R 2.15.2,plotrix_3.4-5,survey_3.29,據我所知可以是所有當前版本。你甚至沒有描述過什麼「不工作」對你意味着什麼。 –

回答

2

正確,因此您正試圖在不知道如何處理該類的函數(barNest)中使用對象類(svyby),因爲調查包和plotrix包不能很好地一起玩。幸運的是svyby對象dotchart方法是不是太多的代碼,所以你可能只是想修改它..

# run your code above, then review the dotchart method for svyby objects: 
    getS3method('dotchart' , 'svyby') 

..和從,你可以學習它真的不是遠遠超出調用原dotchart功能(也就是說,在將b對象中包含的數據轉換爲矩陣後,不使用svyby對象,只是統計數據的常規集合)。現在你所要做的就是增加一個置信區間線。

置信區間寬度很容易通過運行

confint(b) 

獲得的(更容易比使用SE(b))可以提取這些統計數據,以建立自己的barNestplotCI電話?

如果在點圖上放置置信區間很重要,主要障礙是正確地打y座標。在點圖默認方法中挖掘..

getS3method('dotchart' , 'default') 

..你可以看到y座標是如何計算的。削減到只有基本的內容,我想你可以使用這個:

# calculate the distinct groups within the `svyby` object 
    groups <- as.numeric(as.factor(attr(b , 'row.names'))) 

    # calculate the distinct statistics within the `svyby` object 
    nstats <- attr(b , 'svyby')$nstats 

    # calculate the total number of confidence intervals you need to add 
    n <- length(groups) * nstats 

    # calculate the offset sizes 
    offset <- cumsum(c(0, diff(groups) != 0)) 

    # find the exact y coordinates for each dot in the dotchart 
    # and leave two spaces between each group 
    y <- 1L:n + sort(rep(2 * offset , nstats)) 

    # find the confidence interval positions 
    ci.pos <- 
     rep(groups , each = nstats) + 
     c(0 , length(groups)) 

    # extract the confidence intervals 
    x <- confint(b)[ ci.pos , ] 

    # add the y coordinates to a new line data object 
    ld <- data.frame(x) 

    # loop through each dot in the dotchart.. 
    for (i in seq_len(nrow(ld))){ 

     # add the CI lines to the current plot 
     lines(ld[ i , 1:2 ] , rep(y[i] , 2)) 

    } 

但是這顯然笨重,因爲置信區間被允許去的方式在屏幕上。忽略了svyby類,甚至整個survey包一秒鐘,找到我們實現dotchart很好地格式置信區間,我們可能會幫助你更多。我不認爲survey包是你問題的根源:)

+0

安東尼,你是明星。非常感謝你。 – maycobra

+0

只需通過ld更改line.data即可。 – agstudy

+0

@agstudy done thanx :) –

0

向安東尼的最後一位(來自ld < -data.frame(x))添加一個新的點圖(最小和最大值)解決了問題他概述。

ld <- data.frame(x) 
dotchart(b,xlim=c(min(ld),max(ld)))#<-added 
for (i in seq_len(nrow(ld))){ 
    lines(ld[ i , 1:2 ] , rep(y[i] , 2)) 
} 

但我同意安東尼:情節看起來不太好。非常感謝安東尼分享他的知識和編程技巧。置信區間也看起來不對稱(這可能是正確的),特別是對於M api00。有沒有人將此與其他軟件進行比較? confit應該指定一個df(自由度)?

+0

'?svyciprop'列出了所有置信區間計算選項,包括指定'df ='並顯示一個與stata完全匹配的示例..您可以閱讀更多關於Dr. Lumley實現[exact stata match here](https://stat.ethz.ch/pipermail/r-help/2012-September/324464.html) –