【问题标题】:Smooth a binary variable using moving average or kernel smoothing使用移动平均或内核平滑平滑二进制变量
【发布时间】:2012-12-17 15:21:57
【问题描述】:

我有以下形式的数据:

x      y
0      0
0.01   1
0.03   0
0.04   1
0.04   0

x 从 0 到 1 是连续的,并且不等间距,并且 y 是二进制的。

我想使用 R 在 x 轴上平滑 y,但找不到合适的包。我发现的核平滑函数会产生 x 的密度估计值,或者会在 x 的末端给出错误的估计值,因为它们会在小于 0 和大于 1 的区域上取平均值。

我还想避免像 Loess givens 这样的线性平滑器,然后是 y 的二进制形式。我见过的移动平均函数假设等距的 x 值。

您知道任何可以平滑且理想情况下具有带宽选择过程的 R 函数吗?我可以编写一个移动平均函数并进行交叉验证以确定带宽,但我更愿意找到一个经过审查的现有函数。

【问题讨论】:

    标签: r smoothing


    【解决方案1】:

    我建议使用类似的东西

    d <- data.frame(x,y) ## not absolutely necessary but good practice
    library(mgcv)
    m1 <- gam(y~s(x),family="binomial",data=d)
    

    这将 (1) 尊重数据的二进制性质 (2) 使用广义交叉验证进行自动平滑度(您的术语中的“带宽”)选择。

    使用

    plot(y~x, data=d)
    pp <- data.frame(x=seq(0,1,length=101))
    pp$y <- predict(m1,newdata=pp,type="response")
    with(pp,lines(x,y))
    

    library(ggplot2)
    ggplot(d,aes(x,y))+geom_smooth(method="gam",family=binomial)
    

    获得预测/绘制结果。

    (我希望你的真实数据集有超过 5 个观察值……否则这将失败……)

    【讨论】:

    • 做了一些修改。希望你不要介意。一些示例数据(对于任何想尝试 Ben 的代码的人)是:set.seed(1); d &lt;- data.frame(x=seq(0,0.3, by=0.01), y=rbinom(31, 1, prob=0.5))
    • 为了得到不均匀的间距,如问题:d &lt;- data.frame(x=seq(0,0.3, by=0.01) + .009*rnorm(31), y=rbinom(31, 1, prob=0.5)
    • 感谢本、乔什和马修。我熟悉 GLM,但 GAM 对我来说是新的,我从来没有想过使用它们。
    • 用我的数据,15%的x区域的预测值大于1,即使y不能大于1。设置所有大于1的预测值等于1是否有效?谢谢。
    • 您是否已经在使用@JoshO'Brien 对我的答案的编辑中建议的type="response" 参数?
    猜你喜欢
    • 2021-12-20
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 2017-11-07
    • 1970-01-01
    • 2017-04-29
    相关资源
    最近更新 更多