2012-03-20 4 views
40

stat_smoothから返された適合する線の値を抽出する方法はありますか?stat_smoothの線のあてはめを抽出するメソッド

私はこのようなルックスを使用していますコード:

p <- ggplot(df1, aes(x=Days, y= Qty,group=Category,color=Category)) 
p <- p + stat_smooth(method=glm, fullrange=TRUE)+ geom_point()) 

この新しいRのユーザーが大幅にどんな指導をお願い申し上げます。

+2

あなたのコード例は再現性がありません。*できますか? – James

+0

はい私は知っています、そして、私のRが "応答していない"と言ってすぐにそれを作るでしょう。私はちょうど誰かが彼らの頭の上/再現可能なコードを知っているかもしれないと思った。 – MikeTP

+2

AFAIKのように滑らかなものは、プロットがレンダリングされるまで評価されない+評価されないので、答えはノーだと私は信じています。一般に、適合した値などを操作する場合は、モデルをggplotの外に置き、データを特定のレイヤーに渡します。 – joran

答えて

48

stat_smoothは、他の場所で使用できる出力を生成しますが、ややハッキリな方法で、グローバル環境の変数に入れることができます。

出力変数を..に囲んで使用します。したがって、stat_smoothコールにaesを追加し、グローバル割り当て「<<-」を使用してグローバル環境内の変数に出力を割り当てると、適合値などを得ることができます。以下を参照してください。あなたが得ることができ

qplot(hp,wt,data=mtcars) + stat_smooth(aes(outfit=fit<<-..y..)) 
fit 
[1] 1.993594 2.039986 2.087067 2.134889 2.183533 2.232867 2.282897 2.333626 
[9] 2.385059 2.437200 2.490053 2.543622 2.597911 2.652852 2.708104 2.764156 
[17] 2.821771 2.888224 2.968745 3.049545 3.115893 3.156368 3.175495 3.181411 
[25] 3.182252 3.186155 3.201258 3.235698 3.291766 3.353259 3.418409 3.487074 
[33] 3.559111 3.634377 3.712729 3.813399 3.910849 3.977051 4.037302 4.091635 
[41] 4.140082 4.182676 4.219447 4.250429 4.275654 4.295154 4.308961 4.317108 
[49] 4.319626 4.316548 4.308435 4.302276 4.297902 4.292303 4.282505 4.269040 
[57] 4.253361 4.235474 4.215385 4.193098 4.168621 4.141957 4.113114 4.082096 
[65] 4.048910 4.013560 3.976052 3.936392 3.894586 3.850639 3.804557 3.756345 
[73] 3.706009 3.653554 3.598987 3.542313 3.483536 3.422664 3.359701 3.294654 

出力は以下のとおりです。

  • yは、値
  • ymin、平均
  • ymax、平均
  • 周りアッパー点別信頼区間 周りの下点別信頼区間を予測しました
  • se、標準誤差

デフォルトでは、80個のデータポイントが予測されますが、元のデータと一致しない可能性があります。あなたがプロットされたデータを引き出すためにggplot構築プロセスの中間段階を使用することができます

p <- qplot(hp,wt,data=mtcars) + stat_smooth() 
@James例のオフリフ

+6

あなたはそのハッキーを呼んだときにあなたは冗談ではありません。 (あなたはあなたのコードで '<< - 'を見逃しました) – joran

+0

@joranありがとう、今すぐ修正しました。私はその数が生産しているのか疑問に思っています。 – James

+0

私は同意します。 「y」以外のもので試してみるとエラーになります。 – joran

53

ggplot_buildの結果はリストであり、その1つの成分はプロットされる計算値を含むデータフレームのリストであるdataである。この場合、元のqplotがポイントのために1つを作成し、stat_smoothが平滑化されたものを作成するので、リストは2つのデータフレームです。あなたが欲しい1がリストにある場合先験的を知る

> ggplot_build(p)$data[[2]] 
geom_smooth: method="auto" and size of largest group is <1000, so using loess. Use 'method = x' to change the smoothing method. 
      x  y  ymin  ymax  se PANEL group 
1 52.00000 1.993594 1.149150 2.838038 0.4111133  1  1 
2 55.58228 2.039986 1.303264 2.776709 0.3586695  1  1 
3 59.16456 2.087067 1.443076 2.731058 0.3135236  1  1 
4 62.74684 2.134889 1.567662 2.702115 0.2761514  1  1 
5 66.32911 2.183533 1.677017 2.690049 0.2465948  1  1 
6 69.91139 2.232867 1.771739 2.693995 0.2244980  1  1 
7 73.49367 2.282897 1.853241 2.712552 0.2091756  1  1 
8 77.07595 2.333626 1.923599 2.743652 0.1996193  1  1 
9 80.65823 2.385059 1.985378 2.784740 0.1945828  1  1 
10 84.24051 2.437200 2.041282 2.833117 0.1927505  1  1 
11 87.82278 2.490053 2.093808 2.886297 0.1929096  1  1 
12 91.40506 2.543622 2.145018 2.942225 0.1940582  1  1 
13 94.98734 2.597911 2.196466 2.999355 0.1954412  1  1 
14 98.56962 2.652852 2.249260 3.056444 0.1964867  1  1 
15 102.15190 2.708104 2.303465 3.112744 0.1969967  1  1 
16 105.73418 2.764156 2.357927 3.170385 0.1977705  1  1 
17 109.31646 2.821771 2.414230 3.229311 0.1984091  1  1 
18 112.89873 2.888224 2.478136 3.298312 0.1996493  1  1 
19 116.48101 2.968745 2.531045 3.406444 0.2130917  1  1 
20 120.06329 3.049545 2.552102 3.546987 0.2421773  1  1 
21 123.64557 3.115893 2.573577 3.658208 0.2640235  1  1 
22 127.22785 3.156368 2.601664 3.711072 0.2700548  1  1 
23 130.81013 3.175495 2.625951 3.725039 0.2675429  1  1 
24 134.39241 3.181411 2.645191 3.717631 0.2610560  1  1 
25 137.97468 3.182252 2.658993 3.705511 0.2547460  1  1 
26 141.55696 3.186155 2.670350 3.701961 0.2511175  1  1 
27 145.13924 3.201258 2.687208 3.715308 0.2502626  1  1 
28 148.72152 3.235698 2.721744 3.749652 0.2502159  1  1 
29 152.30380 3.291766 2.782767 3.800765 0.2478037  1  1 
30 155.88608 3.353259 2.857911 3.848607 0.2411575  1  1 
31 159.46835 3.418409 2.938257 3.898561 0.2337596  1  1 
32 163.05063 3.487074 3.017321 3.956828 0.2286972  1  1 
33 166.63291 3.559111 3.092367 4.025855 0.2272319  1  1 
34 170.21519 3.634377 3.165426 4.103328 0.2283065  1  1 
35 173.79747 3.712729 3.242093 4.183364 0.2291263  1  1 
36 177.37975 3.813399 3.347232 4.279565 0.2269509  1  1 
37 180.96203 3.910849 3.447572 4.374127 0.2255441  1  1 
38 184.54430 3.977051 3.517784 4.436318 0.2235917  1  1 
39 188.12658 4.037302 3.583959 4.490645 0.2207076  1  1 
40 191.70886 4.091635 3.645111 4.538160 0.2173882  1  1 
41 195.29114 4.140082 3.700184 4.579981 0.2141624  1  1 
42 198.87342 4.182676 3.748159 4.617192 0.2115424  1  1 
43 202.45570 4.219447 3.788162 4.650732 0.2099688  1  1 
44 206.03797 4.250429 3.819579 4.681280 0.2097573  1  1 
45 209.62025 4.275654 3.842137 4.709171 0.2110556  1  1 
46 213.20253 4.295154 3.855951 4.734357 0.2138238  1  1 
47 216.78481 4.308961 3.861497 4.756425 0.2178456  1  1 
48 220.36709 4.317108 3.859541 4.774675 0.2227644  1  1 
49 223.94937 4.319626 3.851025 4.788227 0.2281358  1  1 
50 227.53165 4.316548 3.836964 4.796132 0.2334829  1  1 
51 231.11392 4.308435 3.818728 4.798143 0.2384117  1  1 
52 234.69620 4.302276 3.802201 4.802351 0.2434590  1  1 
53 238.27848 4.297902 3.787395 4.808409 0.2485379  1  1 
54 241.86076 4.292303 3.772103 4.812503 0.2532567  1  1 
55 245.44304 4.282505 3.754087 4.810923 0.2572576  1  1 
56 249.02532 4.269040 3.733184 4.804896 0.2608786  1  1 
57 252.60759 4.253361 3.710042 4.796680 0.2645121  1  1 
58 256.18987 4.235474 3.684476 4.786473 0.2682509  1  1 
59 259.77215 4.215385 3.656265 4.774504 0.2722044  1  1 
60 263.35443 4.193098 3.625161 4.761036 0.2764974  1  1 
61 266.93671 4.168621 3.590884 4.746357 0.2812681  1  1 
62 270.51899 4.141957 3.553134 4.730781 0.2866658  1  1 
63 274.10127 4.113114 3.511593 4.714635 0.2928472  1  1 
64 277.68354 4.082096 3.465939 4.698253 0.2999729  1  1 
65 281.26582 4.048910 3.415849 4.681971 0.3082025  1  1 
66 284.84810 4.013560 3.361010 4.666109 0.3176905  1  1 
67 288.43038 3.976052 3.301132 4.650972 0.3285813  1  1 
68 292.01266 3.936392 3.235952 4.636833 0.3410058  1  1 
69 295.59494 3.894586 3.165240 4.623932 0.3550782  1  1 
70 299.17722 3.850639 3.088806 4.612473 0.3708948  1  1 
71 302.75949 3.804557 3.006494 4.602619 0.3885326  1  1 
72 306.34177 3.756345 2.918191 4.594499 0.4080510  1  1 
73 309.92405 3.706009 2.823813 4.588205 0.4294926  1  1 
74 313.50633 3.653554 2.723308 4.583801 0.4528856  1  1 
75 317.08861 3.598987 2.616650 4.581325 0.4782460  1  1 
76 320.67089 3.542313 2.503829 4.580796 0.5055805  1  1 
77 324.25316 3.483536 2.384853 4.582220 0.5348886  1  1 
78 327.83544 3.422664 2.259739 4.585589 0.5661643  1  1 
79 331.41772 3.359701 2.128512 4.590891 0.5993985  1  1 
80 335.00000 3.294654 1.991200 4.598107 0.6345798  1  1 

は容易ではありませんが、何もない場合は、列名を見ることができます。

でも、ggplotコールの外側で平滑化を行う方が良いです。

EDIT:

それはggplot2loessは、私が思ったほど簡単ではないようにするために何をするか複製が判明し、これは動作します。 ggplot2の内部機能からコピーしました。

ggplot(mtcars, aes(x=hp, y=wt)) + 
    geom_point() + 
    geom_smooth() 

(原pの拡張形式である)と同一に見えるプロットを与える

model <- loess(wt ~ hp, data=mtcars) 
xrange <- range(mtcars$hp) 
xseq <- seq(from=xrange[1], to=xrange[2], length=80) 
pred <- predict(model, newdata = data.frame(hp = xseq), se=TRUE) 
y = pred$fit 
ci <- pred$se.fit * qt(0.95/2 + .5, pred$df) 
ymin = y - ci 
ymax = y + ci 
loess.DF <- data.frame(x = xseq, y, ymin, ymax, se = pred$se.fit) 

ggplot(mtcars, aes(x=hp, y=wt)) + 
    geom_point() + 
    geom_smooth(aes_auto(loess.DF), data=loess.DF, stat="identity") 

+0

ニース、x値を取得するのがもっと便利です。 – James

+0

ありがとうございます。ルーキー好奇心、なぜあなたはggplot呼び出しの外で平滑化を行う方が良いと言いますか?とにかくプロットを作成する必要がある場合は、フィット値を抽出するためにsepreate fitを行うのは繰り返しです。 – MikeTP

+1

ggplotの呼び出しの外側ではなく、ggplotの呼び出しの外側ではなく、代わりにggplotの呼び出しの外側でフィットを行います。私は適切なフォーマット/データフレームに適合データを作成し、それをプロットします。この答えに埋め込まれている例があります:http://stackoverflow.com/a/9742012/892313 –

4

より一般的なアプローチは、単にpredict()関数を使用して興味のある値の範囲を予測することです。

# define the model 
model <- loess(wt ~ hp, data = mtcars) 

# predict fitted values for each observation in the original dataset 
modelFit <- data.frame(predict(model, se = TRUE)) 

# define data frame for ggplot 
df <- data.frame(cbind(hp = mtcars$hp 
      , wt = mtcars$wt 
      , fit = modelFit$fit 
      , upperBound = modelFit$fit + 2 * modelFit$se.fit 
      , lowerBound = modelFit$fit - 2 * modelFit$se.fit 
     )) 

# build the plot using the fitted values from the predict() function 
# geom_linerange() and the second geom_point() in the code are built using the values from the predict() function 
# for comparison ggplot's geom_smooth() is also shown 
g <- ggplot(df, aes(hp, wt)) 
g <- g + geom_point() 
g <- g + geom_linerange(aes(ymin = lowerBound, ymax = upperBound)) 
g <- g + geom_point(aes(hp, fit, size = 1)) 
g <- g + geom_smooth(method = "loess") 
g 

# Predict any range of values and include the standard error in the output 
predict(model, newdata = 100:300, se = TRUE) 
関連する問題