Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:GAM与数据子集的拟合_R_Gam_Mgcv - Fatal编程技术网

R:GAM与数据子集的拟合

R:GAM与数据子集的拟合,r,gam,mgcv,R,Gam,Mgcv,我使用mgcv软件包中的gam拟合广义相加模型。我有一个数据表,其中包含因变量Y、自变量X、其他自变量Oth和两级因子Fac。我想适合以下型号 Y~s(X)+Oth 但是附加的约束条件是,s(X)项只适用于因子的两个级别中的一个,比如说Fac==1。其他术语Oth应与整个数据相匹配 我试着探索s(X,by=Fac),但这会使Oth的适用性产生偏差。换句话说,我想表达这样一种信念:X仅当Fac==1时才与Y相关,否则建模X是没有意义的廉价技巧:如果Fac==1,则在其他地方使用辅助变量X libr

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

Y~s(X)+Oth

但是附加的约束条件是,
s(X)
项只适用于因子的两个级别中的一个,比如说
Fac==1
。其他术语
Oth
应与整个数据相匹配


我试着探索
s(X,by=Fac)
,但这会使
Oth
的适用性产生偏差。换句话说,我想表达这样一种信念:
X
仅当
Fac==1
时才与
Y
相关,否则建模
X

是没有意义的廉价技巧:如果Fac==1,则在其他地方使用辅助变量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)
库(“mgcv”)
图书馆(“ggplot2”)
#模拟数据

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

Y ~ 0th + (Fac==1)*s(X)  
如果您想“仅当
Fac==1时,才表达
X
Y
相关的信念”,请不要将
Fac
视为
因子,而应视为
数值变量。在这种情况下,您将得到
数值
交互,并且只有一组
系数
(当它是一个
因子时,其中有两个)。这种类型的模型是一种
变系数模型

# 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)
#一些数据

数据如果这是正确答案,则在不建模预测值(此处为0)的情况下,您给辅助变量的值不应影响截距的拟合。但是,如果您将其设置为10,您将看到截距发生了很大的变化。当然@yannick,这只是一个“欺骗”gam函数以创建所需的
model.matrix
。我不知道如何做,否则。请提供一个工作的例子。附加问题:如果我的模型更复杂,并且我的模型中已经有另一个因素,比如说
s(X,by=Fac2)
,该怎么办。我如何将上述设计结合起来?我可以做
s(X,by=c(Fac,Fac2))
?文档似乎不允许这样做。我添加了一个示例。第二个因素取决于你想要实现什么?这种情况下的模型是什么?例如,如果
X
仅当
Fac==0
Fac2==0
时才与
Y
相关,则可以创建新变量
new\u Fac=Fac*Fac1
,然后使用
s(X,by=new\u Fac)
。如果答案有帮助,请接受。如果你给我你的模型的规格,我可以考虑:)你的答案是正确的,除了这里公开的内容之外,不允许对每一级的系数
Fac2
进行拟合,即排除案例
Fac==0
。我在问题中没有提到这一点,但这是我在申请中需要的东西,为了清楚起见,我将其保留了下来。因此,我会接受你非常欢迎的回答,但如果你能提出一个解决方案,那就太好了。如果你愿意,我也可以修改这个问题。哇,你的模型真的很有趣。我想我知道如何从数学上解决你的问题,但还不知道如何在R中解决。我只需要一些时间:)你能告诉我你在哪里使用这个模型吗?它在生物信息学的NGS应用程序中。如果你感兴趣的话,还有一个问题,我想把它结合起来: