R dlnm:跨基变换和分布式滞后非线性模型,如何将系数恢复到原始比例?
R dlnm: Cross-basis transformation and distributed lag non-linear models, how to get the coefficient back in the original scale?
由于 R 包 dlnm
,我正在估计分布式滞后非线性模型。自变量是时间 t 的家庭消费,自变量是时间 t-1 到 t-L 的天气状况。第一步包括使用天气暴露历史矩阵构建交叉基矩阵,其中暴露和时间维度都可以灵活建模(crossbasis()
)。这个交叉基础被插入到用 lm()
估计的 ols 回归中。 dlnm 包提供了一些函数来绘制和总结结果(crosspred()
和 crossreduce()
)。
我们如何获得“原始”尺度的参数,即跨基变换之前的参数?
我找到了一些方法(见下文),但是有通用方法吗?
在下面的示例中,曝光维度建模为 2 次多项式,时间维度建模为线性函数。
library(dlnm)
cb <- crossbasis(chicagoNMMAPS$temp,lag=30,
argvar=list("poly",degree=2),
arglag=list("lin"))
model <- lm(cvd~cb,chicagoNMMAPS)
pred <- crosspred(cb,model,at=-20:30)
plot(pred,"slices",lag=0)
# my dirty way:
LAG<-0
SCALE<-attributes(cb)$argvar$scale
ce<-attributes(cb)$argvar$cen
B1<-(summary(model)$coeff[2,1]+summary(model)$coeff[4,1]*LAG)/SCALE
B2<-(summary(model)$coeff[3,1]+summary(model)$coeff[5,1]*LAG)/(SCALE^2)
B0<--(ce*B1+(ce^2)*B2)
xx<-(-20:30)
xx2<-xx^2
yhat<-B0+B1*xx+B2*xx2
lines(-20:30,yhat,lty=2,col="blue")
如下图所示,B 是正确的(蓝虚线与通过 dlnm
包生成的红线完全对齐)。经过大量争论,我找到了我的“肮脏方式”,它背后没有太多数学意义..
他们是否是一种更直接地获得 B 的方法,适用于所有类型的函数形式?
解决方法是将argvar
函数中的scale参数设置为1,然后crossreduce
函数给出原始scale中的参数。下面是一个例子:
# with a poly of degree 2 with natural splines at knots 3 and 10
library(dlnm)
cb <- crossbasis(chicagoNMMAPS$temp,lag=30,
argvar=list("poly",degree=2,scale=1),
arglag=list("ns",knots=c(3,10)))
model <- lm(cvd~cb,chicagoNMMAPS)
pred <- crosspred(cb,model,at=-20:30)
plot(pred,"slices",lag=3)
ce<-attributes(cb)$argvar$cen
xx<-(-20:30)
xx2<-xx^2
redvar<-crossreduce(cb, model,type="lag",value=3)
b1<-redvar$coefficients[1]
b2<-redvar$coefficients[2]
b0<--(ce*b1+(ce^2)*b2)
yhat<-b0+b1*xx+b2*xx2
lines(-20:30,yhat2,lty=2,col="green")
由于 R 包 dlnm
,我正在估计分布式滞后非线性模型。自变量是时间 t 的家庭消费,自变量是时间 t-1 到 t-L 的天气状况。第一步包括使用天气暴露历史矩阵构建交叉基矩阵,其中暴露和时间维度都可以灵活建模(crossbasis()
)。这个交叉基础被插入到用 lm()
估计的 ols 回归中。 dlnm 包提供了一些函数来绘制和总结结果(crosspred()
和 crossreduce()
)。
我们如何获得“原始”尺度的参数,即跨基变换之前的参数?
我找到了一些方法(见下文),但是有通用方法吗?
在下面的示例中,曝光维度建模为 2 次多项式,时间维度建模为线性函数。
library(dlnm)
cb <- crossbasis(chicagoNMMAPS$temp,lag=30,
argvar=list("poly",degree=2),
arglag=list("lin"))
model <- lm(cvd~cb,chicagoNMMAPS)
pred <- crosspred(cb,model,at=-20:30)
plot(pred,"slices",lag=0)
# my dirty way:
LAG<-0
SCALE<-attributes(cb)$argvar$scale
ce<-attributes(cb)$argvar$cen
B1<-(summary(model)$coeff[2,1]+summary(model)$coeff[4,1]*LAG)/SCALE
B2<-(summary(model)$coeff[3,1]+summary(model)$coeff[5,1]*LAG)/(SCALE^2)
B0<--(ce*B1+(ce^2)*B2)
xx<-(-20:30)
xx2<-xx^2
yhat<-B0+B1*xx+B2*xx2
lines(-20:30,yhat,lty=2,col="blue")
如下图所示,B 是正确的(蓝虚线与通过 dlnm
包生成的红线完全对齐)。经过大量争论,我找到了我的“肮脏方式”,它背后没有太多数学意义..
他们是否是一种更直接地获得 B 的方法,适用于所有类型的函数形式?
解决方法是将argvar
函数中的scale参数设置为1,然后crossreduce
函数给出原始scale中的参数。下面是一个例子:
# with a poly of degree 2 with natural splines at knots 3 and 10
library(dlnm)
cb <- crossbasis(chicagoNMMAPS$temp,lag=30,
argvar=list("poly",degree=2,scale=1),
arglag=list("ns",knots=c(3,10)))
model <- lm(cvd~cb,chicagoNMMAPS)
pred <- crosspred(cb,model,at=-20:30)
plot(pred,"slices",lag=3)
ce<-attributes(cb)$argvar$cen
xx<-(-20:30)
xx2<-xx^2
redvar<-crossreduce(cb, model,type="lag",value=3)
b1<-redvar$coefficients[1]
b2<-redvar$coefficients[2]
b0<--(ce*b1+(ce^2)*b2)
yhat<-b0+b1*xx+b2*xx2
lines(-20:30,yhat2,lty=2,col="green")