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