R 带抽样权重的非线性回归(一揽子调查)
我想估计一个具有二元因变量的非线性模型的系数。非线性产生是因为两个回归系数,R 带抽样权重的非线性回归(一揽子调查),r,survey,nonlinear-optimization,R,Survey,Nonlinear Optimization,我想估计一个具有二元因变量的非线性模型的系数。非线性产生是因为两个回归系数,A和B,分别依赖于数据集的子集和两个参数lambda1和lambda2: y = alpha + beta1 * A(lambda1) + beta2 * B(lambda2) + delta * X + epsilon 我的每一个观察结果,我们都在哪里 其中a和Rs是data.frame中的变量。回归子B(lambda2)的定义方式类似 此外,我需要包括Stata中所称的权重,即调查权重或抽样权重。出于这个原因,我
A
和B
,分别依赖于数据集的子集和两个参数lambda1
和lambda2
:
y = alpha + beta1 * A(lambda1) + beta2 * B(lambda2) + delta * X + epsilon
我的每一个观察结果,我们都在哪里
其中a
和Rs
是data.frame
中的变量。回归子B(lambda2)
的定义方式类似
此外,我需要包括Stata中所称的权重,即调查权重或抽样权重。出于这个原因,我正在使用托马斯·卢姆利的R软件包
首先,我为a
(和B
)创建了一个函数,即:
因为,当我尝试估算模型时:
# loglikelihood function:
LLsvy <- function(y, model, lambda1, lambda2){
aux1 <- y * log(pnorm(model))
aux2 <- (1-y) * log(1-pnorm(model))
LL <- (aux1) + (aux2)
return(LL)
}
fit <- svymle(loglike=LLsvy,
formulas=list(~y, model = ~ A(lambda1)+B(lambda2)+X,lambda1=~1,lambda2=~1),
design=d_test,
start=list(c(0,0,0,0),c(lambda1=11),c(lambda2=8)),
na.action="na.exclude")
我认为问题在于包含非线性部分,因为如果我为一些lambda1
和lambda2
修正A
和B
,一切都会正常工作(这样模型就会变成线性):
因为我收到了错误消息:
Error in eval(expr, envir, enclos) : object 'lambda1' not found
Error in svyglm.survey.design(formula = model0, data = data, family = binomial(link = probit), :
all variables must be in design= argument
这不是svymle所做的——它适用于广义线性模型,它具有线性预测和潜在复杂的似然函数或损失函数。您需要非线性加权最小二乘法,具有简单的损失函数,但预测复杂
调查包中没有设计加权非线性最小二乘法的实现,可能是因为之前没有人要求过。你可以试着给软件包作者发电子邮件 即将发布的调查软件包第4版将具有一个功能
svynls
,因此,如果您知道如何在不使用nls抽样权重的情况下拟合模型,您将能够使用抽样权重拟合模型。以下是数据集的一个子样本,以便每个人都可以复制我上面发布的代码:无法将调查权重实施到更高级的工作模型中(如gmm)意味着R的估计能力仍然远远低于Stata。作为一个试图从Stata移动到R的用户,这是令人沮丧的。我希望将来会有所改变……也许您可以尝试使用gmm()
包中的,它允许指定采样权重?非常感谢您回到本主题。我不再参与这个项目,但我希望它对其他用户有用。
Error in eval(expr, envir, enclos) : object 'lambda1' not found
lambda1=11
lambda2=8
data$A <- A(lambda1)
data$B <- B(lambda2)
d_test <- svydesign(id=~1, data = data, weights = ~data$hw0010)
LLsvylin <- function(y, model){
aux1 <- y * log(pnorm(model))
aux2 <- (1-y) * log(1-pnorm(model))
LL <- (aux1) + (aux2)
return(LL)
}
fitlin <- svymle(loglike=LLsvylin,
formulas=list(~y, model = ~A+B+X),
design=d_test,
start=list(0,0,0,0),
na.action="na.exclude")
lambda1=11
lambda2=8
model0 = y ~ A(lambda1) + B(lambda2) + X
probit1 = svyglm(formula = model0,
data = data,
family = binomial(link=probit),
design = d_test)
Error in svyglm.survey.design(formula = model0, data = data, family = binomial(link = probit), :
all variables must be in design= argument