【问题标题】:R: GAM with fit on subset of dataR:适合数据子集的 GAM
【发布时间】:2015-12-07 14:07:04
【问题描述】:

我使用mgcv 包中的gam 拟合了一个广义加法模型。我有一个数据表,其中包含我的因变量Y、一个自变量X、其他自变量Oth 和一个两级因子Fac。我想拟合以下模型

Y ~ s(X) + Oth

但有一个额外的约束,即s(X) 项仅适合因子的两个级别之一,例如Fac==1。其他术语Oth 应该适合整个数据。

我尝试探索s(X,by=Fac),但这会偏向于Oth。换句话说,我想表达的信念是XY 只有当Fac==1 相关,否则建模X 是没有意义的。

【问题讨论】:

    标签: r gam mgcv


    【解决方案1】:

    便宜的技巧:如果 Fac == 1 和其他地方的 0,则使用辅助变量 X。

    library("mgcv")
    library("ggplot2")
    
    
    # simulate data
    
    N <- 1e3
    
    dat <- data.frame(covariate = runif(N),
                      predictor = runif(N),
                      group = factor(sample(0:1, N, TRUE)))
    
    dat$outcome <- rnorm(N,
                         1 * dat$covariate +
                         ifelse(dat$group == 1,
                                .5 * dat$predictor +
                                1.5 * sin(dat$predictor * pi),
                                0), .1)
    
    # some plots
    
    ggplot(dat, aes(x = predictor, y = outcome,
                    col = group, group = group)) +
        geom_point()
    
    ggplot(dat, aes(x = covariate, y = outcome,
                    col = group, group = group)) +
        geom_point()
    
    # create auxiliary variable
    
    dat$aux <- ifelse(dat$group == 1,
                      dat$predictor,
                      0)
    
    # fit the data
    
    fit1 <- gam(outcome ~ covariate + s(predictor, by = group),
                data = dat)
    
    fit2 <- gam(outcome ~ covariate + s(aux, by = group),
                data = dat)
    
    # compare fits
    
    summary(fit1)
    
    summary(fit2)
    

    【讨论】:

    • 如果这是正确答案,那么在不对预测变量进行建模的情况下(此处为 0)赋予辅助变量的值不应影响截距的拟合.但是,如果将其设置为 10,您会看到截距发生了很大变化。
    • 当然@yannick,这只是“欺骗”gam 函数以根据需要创建model.matrix 的技巧。我不知道该怎么做。
    【解决方案2】:

    如果我理解正确,您正在考虑一些具有这样交互的模型:

    Y ~ 0th + (Fac==1)*s(X)  
    

    如果你想“表达XY 相关的信念,仅当Fac==1 时”不要将Fac 视为factor,而是将其视为numeric 变量。在这种情况下,您将获得numeric 交互,并且只有一组coefficients(当它是factor 时有两个)。这种类型的模型是varying coefficient model

    # some data
    data <- data.frame(th = runif(100),
                  X = runif(100),
                  Y = runif(100),
                  Fac = sample(0:1, 100, TRUE))
    data$Fac<-as.numeric(as.character(data$Fac)) #change to numeric
    # then run model
    gam(Y~s(X, by=Fac)+th,data=data)
    

    请参阅文档?sby 选项的文档

    【讨论】:

    • 请提供一个工作示例。额外的问题:如果我的模型更复杂,并且我的模型中已经有另一个因素,比如s(X, by=Fac2),该怎么办。我怎样才能融入上述设计?我可以做s(X, by=c(Fac,Fac2)) 吗?文档似乎不允许这样做。
    • 我添加示例。对于第二个因素,这取决于您想要实现什么?在这种情况下,模型是什么?例如,如果X 仅在Fac==0Fac2==0Y 相关时,您可以创建新变量New_Fac=Fac*Fac1,然后使用s(X,by=New_Fac)。如果有帮助,请采纳答案。如果你给我你的模型规格,我可以考虑一下:)
    • 您的回答是正确的,除了此处公开的内容外,不允许对因子Fac2 的每个级别进行拟合,即排除案例Fac==0。我没有在问题中提到这一点,但这是我的应用程序中需要的东西,为了清楚起见,我将其保留了下来。因此,我会接受您非常受欢迎的回答,但如果您能为此提出解决方案,那就太好了。如果您愿意,我也可以修改问题。
    • 哇,你的模特真有趣。我想我知道如何在数学上解决你的问题,但还不知道如何在 R 中解决。我只需要一些时间:) 你能告诉你在哪里使用这个模型吗?
    • 它在生物信息学中的 NGS 应用程序中。如果你有兴趣,还有这个问题,我打算结合起来:stats.stackexchange.com/q/185871/5404
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多