采样权重的非线性回归(包调查)

时间:2016-03-21 19:06:37

标签: r survey nonlinear-optimization

我想估计具有二元因变量的非线性模型的系数。出现非线性是因为两个回归量AB分别依赖于数据集的子集以及两个参数lambda1lambda2

y = alpha + beta1 * A(lambda1) + beta2 * B(lambda2) + delta * X + epsilon

对于每次观察 i ,我们有

enter image description here

aRsdata.frame中的变量。回归量B(lambda2)以类似的方式定义。

此外,我需要在Stata中包含被称为 pweights 的内容,即调查权重或抽样权重。出于这个原因,我正在使用Thomas Lumley的R包survey

首先,我为A(和B)创建了一个函数,即:

A <- function(l1){
  R <- as.matrix(data[,1:(80)])
  a <- data[,169]
  N = length(a)
  var <- numeric(N)
  for (i in 1:N) {
   ai <- rep(a[i],a[i]-1) # vector of a(i)
   k <- 1:(a[i]-1) # numbers from 1 to a(i)-1
   num <- (ai-k)^l1
   den <- sum((ai-k)^l1)
   w <- num/den
   w <- c(w,rep(0,dim(R)[2]-length(w)))
   var[i] <- R[i,] %*% w
  }
  return(var)
}

B <- function(l2){
 C <- as.matrix(data[,82:(161-1)])
 a <- data[,169]
 N = length(a)
 var <- numeric(N)
 for (i in 1:N) {
  ai <- rep(a[i],a[i]-1) # vector of a(i)
  k <- 1:(a[i]-1) # numbers from 1 to a(i)-1
  num <- (ai-k)^l2
  den <- sum((ai-k)^l2)
  w <- num/den
  w <- c(w,rep(0,dim(C)[2]-length(w)))
  var[i] <- C[i,] %*% w
 }
 return(var)
}

但问题是我不知道如何在模型中(或在调查设计中使用函数svydesign)包含非线性回归量

d_test <- svydesign(id=~1, data = data, weights = ~data$hw0010)

因为,当我尝试估计模型时:

# 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")

我收到错误消息:

Error in eval(expr, envir, enclos) : object 'lambda1' not found

我认为问题在于包含非线性部分,因为如果我为某些AB修复了lambda1lambda2,那么一切正常。模型变成线性的:

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")

相反,如果我不使用采样权重,我可以使用包mle中的函数stats4或函数mle2轻松估算我的非线性模型包bbmle

总结一下, 如何在估算非线性模型(我可以使用svymlemle进行)时组合采样权重(mle2)?

=============================================== ==========================

使用函数svyglm(具有固定lambda1lambda2时,模型的非线性部分也会出现问题,以便为{{1}获得良好的起始值}):

svymle

因为我收到错误消息:

lambda1=11
lambda2=8
model0 = y ~ A(lambda1) + B(lambda2) + X

probit1 = svyglm(formula = model0,
                     data = data,
                     family = binomial(link=probit),
                     design = d_test)

2 个答案:

答案 0 :(得分:0)

这不是svymle所做的-它适用于广义线性模型,该模型具有线性预测变量和可能复杂的似然或损失函数。您需要具有简单损失函数但复杂的预测变量的非线性加权最小二乘法。

在调查包中没有实现设计加权的非线性最小二乘法,这可能是因为以前没有人要求一个。您可以尝试通过电子邮件发送软件包作者。

答案 1 :(得分:0)

即将推出的调查软件包的第4版将具有功能svynls,因此,如果您知道如何在不使用nls进行权重抽样的情况下拟合模型,则可以通过抽样权重对其进行拟合。