UPDATE2:基于discussion in chat,看起来您指的是二维内核平滑函数。 smoothie package 可能有你需要的东西。
无论您如何估计给定 (x,y) 点的贷款违约概率(映射到填充颜色的变量,我在下面将其称为 p.default)(例如,分箱平均值、逻辑回归,内核平滑等),您可以使用以下内容创建绘图:
ggplot(df, aes(assets, debt, fill=p.default)) + geom_tile()
更新:关于您的评论,对于 iris 示例,您需要对 Sepal.Length 和 Sepal.Width 区域的 y 值进行平均以获得平均概率。这些数据非常稀少,因此您需要相对较大的单元格来获得每个单元格的多个观察值。此外,Sepal.Length 和 Sepal.Width 对于每个物种而言几乎位于完全不同的区域,因此您仍然会在几乎所有单元格中得到全 1 或全 0。在下面的示例中,我只是分配了 1 和 0 的随机值,以便在多个单元格中获得 1 和 0 的混合。
library(ggplot2)
library(dplyr)
# Fake data
set.seed(5)
plt <- data.frame(iris[c(1,2)], y=sample(0:1, nrow(iris), replace=TRUE))
在下面的代码中,我们使用cut 函数将Sepal.Length 和Sepal.Width 分别分成10 个范围。然后我们平均每个单元格中的 1 和 0,以获得每个单元格的 y 的平均值。然后,这个平均 y 值由填充颜色渐变表示。
plt %>% group_by(Sepal.Length = cut(Sepal.Length, 10),
Sepal.Width = cut(Sepal.Width, 10)) %>%
summarise(y=mean(y)) %>%
ggplot(aes(Sepal.Width, Sepal.Length, fill=y)) +
geom_tile() +
theme_classic()
或者,我们可以拟合一个逻辑回归模型,它可以为Sepal.Length 和Sepal.Width 的任意组合提供y 的预测:
# Logistic regression model
m1 = glm(y ~ poly(Sepal.Length,2)*poly(Sepal.Width,2), family="binomial", data=plt)
# Get predictions on a grid of values
df = expand.grid(Sepal.Length=seq(4,8,length=100), Sepal.Width=seq(2,5,length=100))
df$y.pred = predict(m1, newdata=df, type="response")
ggplot(df, aes(Sepal.Width, Sepal.Length, fill=y.pred)) +
geom_tile() +
theme_classic() +
scale_fill_gradient2(low="blue",mid="yellow",high="red", midpoint=0.5,limits=c(0,1))
一般的想法是,您需要一个值(我们称之为z)与图表上的每个 (x,y) 点相关联。您可以通过对 (x,y) 平面中的区域、模型等进行平均来计算这些 z 值。一旦有了与每个 (x,y) 点对应的 z 值,您就可以生成一个平铺图,其中z 是fill 美学。
原答案
听起来您可能想要一张热图。填充颜色将代表第三个变量的值,在这种情况下为默认概率。也许是这样的:
library(ggplot2)
# Fake data
df = expand.grid(income=seq(1,1e5,length=100), debt=seq(1,5e5,length=100))
df$p.default = df$income - 0.3*df$debt
df$p.default = df$p.default - max(df$p.default)
df$p.default = abs(df$p.default)/max(abs(df$p.default))
ggplot(df, aes(income, debt, fill=p.default)) +
geom_tile() +
scale_fill_gradient2(limits=c(0,1), low="blue", mid="yellow", high="red", midpoint=0.5)