R:使用MCMCregress进行多变量贝叶斯回归会引发错误

时间:2014-04-20 18:42:13

标签: r regression bayesian

我在R运行多变量贝叶斯回归(数值变量取决于3个解释因子变量)和MCMCpack packageMCMCregress函数。

不幸的是,我的数据集引发了错误"Error in eval(expr, envir, enclos) : NA/NaN/Inf in foreign function call (arg 17)"

这是一个重现我的回归任务和错误的示例代码:

require(MCMCpack)

# Function for creation of a reproducable example
set.seed(0)
example.dataframe= function(size) {
  y= runif(size, 1, 25)
  x1=paste(letters[runif(size, min=1, max=25)])
  x2=paste(letters[runif(size, min=1, max=25)])
  x3=paste(letters[runif(size, min=1, max=25)])
  df= data.frame(y, x1=as.factor(x1), x2=as.factor(x2), x3=as.factor(x3))
  df
}

### Bayesian linear regression with small dataset
df= example.dataframe(10)
model <- MCMCregress(y ~ x1 + x2 + x3 - 1, data= df)
# Fails !
# Error in eval(expr, envir, enclos) :
# NA/NaN/Inf in foreign function call (arg 17)

当数据帧较大时,不会抛出错误:

### Bayesian linear regression with bigger dataset
df= example.dataframe(100)
model <- MCMCregress(y ~ x1 + x2 + x3 - 1, data= df)
# Works !

summary(model)
# Iterations = 1001:11000
# Thinning interval = 1 
# Number of chains = 1 
# Sample size per chain = 10000 
# 
# 1. Empirical mean and standard deviation for each variable,
# plus standard error of the mean:
#   
#             Mean     SD Naive SE Time-series SE
# x1a      5.13964  7.823  0.07823        0.07520
# x1b     14.05264  7.289  0.07289        0.07289
# ...

我正在查看CRAN documentation of the package,但没有找到关于错误的明确提示,这是原因。

有关为什么在第一种情况下而不是在第二种情况下抛出错误的任何建议?

1 个答案:

答案 0 :(得分:1)

基本问题是,对于较小的数据集,您没有足够的信息来估计模型中的参数(也就是说,您没有自由度)。如果运行经典线性回归,您将看到模型的R平方,较小的数据为1.换句话说,回归模型可以解释围绕其均值的结果的100%变化。

为了清楚起见,这个问题与MCMCregress无关。这是使用R中的线性回归函数的较小数据集,它显示了类似的错误消息:

# data set
set.seed(0)
example.dataframe= function(size) {
y = runif(size, 1, 25)
x1 = paste(letters[runif(size, min=1, max=25)])
x2 = paste(letters[runif(size, min=1, max=25)])
x3 = paste(letters[runif(size, min=1, max=25)])
df = data.frame(y, x1=as.factor(x1), x2=as.factor(x2), x3=as.factor(x3))
df
}

# classical linear regression with small data set
df = example.dataframe(10)
model <- lm(y ~ x1 + x2 + x3 - 1, data= df)
# notice the R-squared is 1
# also notice a similar error message as with MCMCregress

那么解决方案是什么?要么使用完整的数据集,要么减少估计的参数数量(也就是说,不要在等式的右边使用尽可能多的输入)。这两个过程都会增加模型的自由度。

这是使用这两种方法的无错误示例:

# (1) solution 1: fewer parameters estimated
df = example.dataframe(10)
model <- MCMCregress(y ~ x1, data= df)

# (2) solution 2: more data used 
df = example.dataframe
model <- lm(y ~ x1 + x2 + x3 - 1, data= df)

有关详细信息,您可能希望从统计信息中了解degrees of freedom的概念。

更新:还有另一种解决方案。您可以使用维数减少技术(例如因子分析)将等式右侧的变量组合成较小的集合。这是一个粗略的例子:

# (3) solution 3: dimension reduction (e.g., factor analysis)
require(psych) # for "fa" function
df$x1 <- as.numeric(df$x1); df$x2 <- as.numeric(df$x2)
df$x3 <- as.numeric(df$x3)
fa <- fa(df[,2:4], rotate="varimax") 
model <- lm(y ~ fa$scores)

最终尝试估算比数据更多的参数就像将水变成葡萄酒或稻草变成黄金一样 - 这是不可能的。您唯一的希望是,您可以估计更少的参数,获取更多数据,并意识到您的某些变量实际上是彼此的代理(或组合形成一组较小的潜在变量)。