サンプルデータ:
pp.inc <- structure(list(has.di.rec.pp = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0), m.dist.km2 = c(-34.4150009155273, 6.80600023269653, -6.55499982833862,
-61.7700004577637, 15.6840000152588, -11.2869997024536, -26.9729995727539,
0, 81.9940032958984, -35.1459999084473, -12.5179996490479, 0,
21.5919990539551, 81.9940032958984, -20.7770004272461, 85.9469985961914,
-15.2959995269775, -75.5879974365234, 81.9940032958984, 3.04999995231628,
-17.1490001678467, -25.806999206543, -16.0060005187988, -14.91100025177,
-12.9020004272461, -16.0060005187988, 5.44000005722046, -34.4150009155273,
81.9940032958984, 3.61400008201599, 13.7379999160767, 2.71300005912781,
4.31300020217896), treated = c(0, 1, 0, 0, 1, 0, 0, 1, 1, 0,
0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1,
1, 1)), .Names = c("has.di.rec.pp", "m.dist.km2", "treated"), row.names = c(NA,
-33L), class = c("data.table", "data.frame"))
コード:
library(data.table)
library(ggplot2)
rddplot <- function(data, outcome, runvar, treatment = treated, span, bw, ...){
data <- data.table(data)
data.span <- data[abs(runvar) <= span, ]
data.span <- data.span[ , bins := cut(runvar,
seq(-span, span, by = bw),
include.lowest = TRUE, right = FALSE)]
data.span.plot <- data.span[ , list(avg.outcome = mean(outcome),
avg.runvar = mean(runvar),
treated = max(treatment),
n.iid = length(outcome)), keyby = bins]
data.span.plot <- data.span.plot[ , runvar := head(seq(-span, span, by = bw), -1)]
bp <- ggplot(data = data.span.plot, aes(x = runvar, y = avg.outcome))
bp <- bp + geom_point(aes(colour = n.iid))
bp <- bp + stat_smooth(data = data.span, aes(x = runvar, y = outcome,
group = factor(treatment)), ...)
bp
return(bp)
}
rddplot(pp.inc, has.di.rec.pp, m.dist.km2, treated, 50, 5)
関数でラップしないと、このコードは完璧に動作します。私は R の初心者で、ほとんど使用していません。私は何を間違っていますか?明らかな何かが欠けていますか、それとも or と関係がありますdata.table
かggplot2
? 他の質問で問題があり、使用する必要があると言及されているため、ggplot に何かあるのではないかと思いましたaes_string
。data.table
基本関数を使用するようにパーツを書き直すことができます。しかし、その前の2行目でエラーがすでに発生していると思います。どうすればこれを機能させることができますか?
編集:
[元のタイトル: R 関数は eval(expr、envir、enclos) でエラーを返します: オブジェクト 'name' が見つかりません]
これをもう一度見て解決策を見つけたので、タイトルも少し変更しました。使用eval()
してもうまくいかなかったので、[['columname']]
選択ルートに行きました。これはggplot2以外の関数のみを使用するようにdata.table
(そしてplyr
同様に)捨てました。base
改善方法などコメントいただければ幸いです。本質的な欠陥がある場合はお知らせください。そうでない場合は、後でソリューションに回答を追加します。
必要なブレークポイントが常にゼロになるようにビンの計算を変更しました。デフォルトの binwidth は、Silverman ルールによって決定されます。ggplot 内のモデルの選択が限られているため、モデルの適合度を個別に計算して返すことを考えていますが、これを lm や loess などのさまざまな多様なモデルに組み込む良い方法は思いつきません。厳密にはそうではありません。必要。実際には、各ビンの観測数を表示する細い棒グラフをオーバーレイしたかったのですが、ggplot ではこれが不可能であることがわかりました (これは一般的に悪い考えですが、同様のグラフを使用するよく出版された論文がいくつかあります)。size
私はここで魅力的な美学を見つけませんが、これらは本当にマイナーな不満です.
私を正しい道に導いてくれてありがとう。
私の解決策:
rddplot <- function(data, outcome, runvar, treatment = treated,
span, bw = bw.nrd0(data[[runvar]]), ...){
breaks <- c(sort(-seq(0, span, by = bw)[-1]), seq(0, span, by = bw))
data.span <- data[abs(data[[runvar]]) <= max(breaks), ]
data.span$bins <- cut(data.span[[runvar]], breaks,
include.lowest = TRUE, right = FALSE)
data.span.plot <- as.data.frame(cbind(tapply(data.span[[outcome]], data.span$bins, mean),
tapply(data.span[[runvar]], data.span$bins, mean),
tapply(data.span[[treatment]], data.span$bins, max),
tapply(data.span[[outcome]], data.span$bins, length),
tapply(data.span[[outcome]], data.span$bins, sum)))
colnames(data.span.plot) <- c("avg.outcome", "avg.runvar", "treated", "n.iid", "n.rec")
data.span.plot$runvar <- head(breaks, -1)
print(data.span.plot)
bp <- ggplot(data = data.span.plot, aes(x = runvar, y = avg.outcome))
bp <- bp + geom_point(aes(size = n.iid))
bp <- bp + stat_smooth(data = data.span, aes_string(x = runvar, y = outcome,
group = treatment), ...)
print(bp)
}
電話:
rddplot(pp.inc, "has.di.rec.pp", "m.dist.km2", "treated", 50,
method = lm, formula = y ~ poly(x, 4, raw = TRUE))