我想根据分类变量z计算y到x(连续)的微分响应。
在标准的lm设置中:
lm(y~ x:z)
但是,我希望在允许“获取”中的脉冲指示器饱和度(IIS)的同时执行此操作。包。但是,以下语法会产生错误:
isat(y, mxreg=x:z, iis=TRUE)
错误消息的格式为:
" solve.qr中的错误(out,tol = tol,LAPACK = LAPACK): 奇异矩阵' a'在'解决"
1:在x:z中: 数值表达式有96个元素:只使用第一个
2:在x:z中: 数值表达式有96个元素:只有第一个使用"
我应该如何修改语法?
谢谢!
答案 0 :(得分:1)
目前,唉,isat
并未在分类/字符变量上提供与lm
相同的功能,也没有使用*
和:
。我们希望在将来的版本中解决这个问题。
与此同时,您必须在数据集中创建表示交互的不同变量。我猜想有类似的事情......
library(gets)
N <- 100
x <- rnorm(N)
z <- c(rep("A",N/4),rep("B",N/4),rep("C",N/4),rep("D",N/4))
e <- rnorm(N)
y <- 0.5*x*as.numeric(z=="A") + 1.5*x*as.numeric(z=="B") - 0.75*x*as.numeric(z=="C") + 5*x*as.numeric(z=="D") + e
lm.reg <- lm(y ~ x:z)
arx.reg.0 <- arx(y,mxreg=x:z)
data <- data.frame(y,x,z,stringsAsFactors=F)
for(i in z[duplicated(z)==F]) {
data[[paste("Zx",i,sep=".")]] <- data$x * as.numeric(data$z==i)
}
arx.reg.1 <- arx(data$y,mxreg=data[,c("x","Zx.A","Zx.B","Zx.C")])
isat.1 <- isat(data$y,mc=TRUE,mxreg=data[,c("x","Zx.A","Zx.B","Zx.C")],max.block.size=20)
请注意,由于您要为每个类别创建虚拟对象,因此这些虚拟对象会导致您的解释变量矩阵的奇点(如果在我的示例中,isat
会自动使用4个街区)。使用参数max.block.size
可以避免此问题。
如果我没有解决你的具体问题,请告诉我。