2011-05-23 75 views
4

有沒有辦法將縮短的長軸線(理想情況下CI)添加到ggplot?我知道我可以使用method =「lm」來獲得OLS適配,但似乎沒有RMA的默認方法。我可以從包lmodel2中獲得RMA coefs和CI間隔,但將它們與geom_abline()相加似乎不起作用。這裏是虛擬數據和代碼。我只是想更換OLS線和CI與RMA線和CI:R ggplot的主軸線和CI減少

dat <- data.frame(a=log10(rnorm(50, 30, 10)), b=log10(rnorm(50, 20, 2))) 

ggplot(dat, aes(x=a, y=b)) + 
    geom_point(shape=1) +  
    geom_smooth(method="lm") 

EDIT1:下面的代碼獲取RMA(這裏稱爲SMA - 標準化長軸)coefs和獨聯體國家。包裝lmodel2提供更詳細的輸出,而封裝smatr只返回coefs和獨聯體國家,如果這是任何幫助:

library(lmodel2) 
fit1 <- lmodel2(b ~ a, data=dat) 

library(smatr) 
fit2 <- line.cis(b, a, data=dat) 
+1

請添加您正在使用的'lmodel2()'的代碼。 – Chase 2011-05-23 21:54:56

回答

5

大通評論,實際lmodel2()代碼,並且使用將是有益的ggplot代碼。但這裏的,可能你指出正確方向邁出的例子:

dat <- data.frame(a=log10(rnorm(50, 30, 10)), b=log10(rnorm(50, 20, 2))) 
mod <- lmodel2(a ~ b, data=dat,"interval", "interval", 99) 

#EDIT: mod is a list, with components (data.frames) regression.results and 
#  confidence.intervals containing the intercepts+slopes for different 
#  estimation methods; just put the right values into geom_abline 
ggplot(dat,aes(x=b,y=a)) + geom_point() + 
    geom_abline(intercept=mod$regression.results[4,2], 
      slope=mod$regression.results[4,3],colour="blue") + 
    geom_abline(intercept=mod$confidence.intervals[4,2], 
      slope=mod$confidence.intervals[4,4],colour="red") + 
    geom_abline(intercept=mod$confidence.intervals[4,3], 
      slope=mod$confidence.intervals[4,5],colour="red") + 
    xlim(c(-10,10)) + ylim(c(-10,10)) 

全面披露:我什麼都不知道RMA的迴歸,所以我只是想出來的培訓相關的斜率和截距,一屁股它們變成geom_abline(),使用一些示例代碼作爲指導從lmodel2。在這個玩具示例中生成的配置項似乎沒什麼意義,因爲我必須使用xlim()ylim()來強制ggplot縮小以查看配置項線(紅色)。

但也許這會幫助你在ggplot()構建一個工作示例。

EDIT2:使用OPS添加的代碼來提取係數,該ggplot()會是這樣的:

ggplot(dat,aes(x=b,y=a)) + geom_point() + 
geom_abline(intercept=fit2[1,1],slope=fit2[2,1],colour="blue") + 
geom_abline(intercept=fit2[1,2],slope=fit2[2,2],colour="red") + 
geom_abline(intercept=fit2[1,3],slope=fit2[2,3],colour="red") 
+0

正是我要寫的,+1。這裏需要注意的是'lmodel2()'返回一個列表,'regression.results'是一個data.frame,它是該列表的一部分。從那裏,只是指定你想要從data.frame中提取的內容。 – Chase 2011-05-23 22:22:36

+0

@Chase - 編輯包含你的觀點,謝謝。令人煩惱的是,regression.results data.frame有一些奇怪的colnames,大概是爲了視覺效果。 「坡度」欄實際上是「坡度」。這讓我很快就絆倒了,所以我最終使用了「[」。 – joran 2011-05-23 22:30:45

+0

謝謝,這對於實際的行很有效,但是爲什麼CI很奇怪呢?另外,在這個軟件包中,RMA =長軸和SMA =縮小(標準化)主軸,因此行數將是3而不是4。smatr包,我在編輯問題時給出的代碼實際上使它更容易獲得係數。 – Steve 2011-05-23 22:37:15

7

建立關Joran的答案,我認爲這是一個比較容易的整個數據幀傳送到geom_abline

library(ggplot2) 
library(lmodel2) 

dat <- data.frame(a=log10(rnorm(50, 30, 10)), b=log10(rnorm(50, 20, 2))) 
mod <- lmodel2(a ~ b, data=dat,"interval", "interval", 99) 

reg <- mod$regression.results 
names(reg) <- c("method", "intercept", "slope", "angle", "p-value") 

ggplot(dat) + 
    geom_point(aes(b, a)) + 
    geom_abline(data = reg, aes(intercept = intercept, slope = slope, colour = method))