我希望进行logit回归,以预测平均家庭规模和年龄的边际效应,以及二元指标(无论个人是移民,有健康保险还是吸烟)对预期概率的影响发展中的高血压。
此数据来自聚类调查,我希望在输出中包括可靠的聚类标准误差。
但是,当我添加代码以包含健壮的集群SE时,我收到一个错误,即不再找到回归变量,并且不确定为什么。任何建议都很好!谢谢。
AGE IMMIGRANT FAMSIZE HLTH_INS HYPERTEN SMOKE PSU
<int> <dbl> <int> <dbl> <dbl> <dbl> <int>
40 0 2 1 0 0 2
23 0 2 1 0 0 1
24 0 2 1 0 0 2
18 0 3 1 1 0 2
30 0 2 1 0 0 2
33 1 6 0 0 0 1
#or if this is an easier output to reproduce:
structure(list(AGE = c(40L, 23L, 24L, 18L, 30L, 33L, 32L, 63L,
22L, 24L), IMMIGRANT = c(0, 0, 0, 0, 0, 1, 0, 0, 0, 1), FAMSIZE = c(2L,
2L, 2L, 3L, 2L, 6L, 2L, 1L, 2L, 1L), HLTH_INS = c(1, 1, 1, 1,
1, 0, 1, 1, 1, 0), HYPERTEN = c(0, 0, 0, 0, 0, 0, 0, 1, 0, 0),
SMOKE = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 1), PSU = c(2L, 1L,
2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L)), row.names = c(NA, -10L), class = "data.frame")
#The regression works without adjusting for clustered SE
logit<-logitmfx(HYPERTEN~scale(AGE)+IMMIGRANT+scale(FAMSIZE)+HLTH_INS+
SMOKE,data=sample,
atmean=TRUE,robust=T)
#However, when I add in the code to cluster SE I receive the error: "Error in scale(AGE) : object 'AGE' not found"
logit<-logitmfx(HYPERTEN~scale(AGE)+IMMIGRANT+scale(FAMSIZE)+HLTH_INS+
SMOKE,data=sample,
atmean=TRUE,robust=T,clustervar1="PSU", clustervar2=NULL,!is.null("PSU"))
答案 0 :(得分:5)
尝试使用源代码复制功能的步骤,Steffen Moritz的解决方案确实应该起作用。由于第一个logitmfx
立即调用了另一个函数logitmfxest
,因此出现了问题。
此函数具有相同的参数,但也具有以下代码:
if(!is.null(clustervar1)){
if(is.null(clustervar2)){
if(!(clustervar1 %in% names(data))){
stop("clustervar1 not in data.frame object")
}
data = data.frame(model.frame(formula, data, na.action=NULL),data[,clustervar1])
names(data)[dim(data)[2]] = clustervar1
data=na.omit(data)
}
if(!is.null(clustervar2)){
if(!(clustervar1 %in% names(data))){
stop("clustervar1 not in data.frame object")
}
if(!(clustervar2 %in% names(data))){
stop("clustervar2 not in data.frame object")
}
data = data.frame(model.frame(formula, data, na.action=NULL),
data[,c(clustervar1,clustervar2)])
names(data)[c(dim(data)[2]-1):dim(data)[2]] = c(clustervar1,clustervar2)
data=na.omit(data)
}
}
根据您的情况,以下代码将被激活:
if(!is.null(clustervar1)){
if(is.null(clustervar2)){
data = data.frame(model.frame(formula, data, na.action=NULL),data[,clustervar1])
names(data)[dim(data)[2]] = clustervar1
data=na.omit(data)
}
}
这将“数据”重新定义为在model.frame上构建的data.frame。但是模型框架使用公式中的名称,因此第2列突然称为 scale.AGE。。第3列称为 scale.FAMSIZE。。
这是一个大问题,因为该函数随后调用了广义线性模型:
fit = glm(formula, data=data, family = binomial(link = "logit"), x=T,
start = start, control = control)
它使用包含scale(AGE)和scale(FAMSIZE)的原始公式,但使用具有重命名列的新数据框。
因此在输入之前进行缩放应该有效。确实,正如史蒂芬(Steffen)所述,其他任何函数也会导致相同的错误,因为调用model.frame
时,它们将产生类似的列重命名。
答案 1 :(得分:4)
奇怪,以某种方式无法再识别formula
中的功能。
您可以尝试执行此操作,如果删除scale
,则可以正常运行。同样,没有其他功能像log()
起作用。
您可以尝试先计算比例尺(AGE),然后不必将其放入公式中。
可能看起来像这样:
sample$AGE<-scale(sample$AGE)
sample$FAMSIZE<-scale(sample$FAMSIZE)
form <- as.formula(HYPERTEN~AGE+IMMIGRANT+FAMSIZE+HLTH_INS+SMOKE)
#However, when I add in the code to cluster SE I receive the error: "Error in scale(AGE) : object 'AGE' not found"
logit<-logitmfx(form,data=sample,
atmean=TRUE,robust=T,clustervar1="PSU", clustervar2=NULL)