Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
日志链接不工作的R中的GLM函数_R_Stata - Fatal编程技术网

日志链接不工作的R中的GLM函数

日志链接不工作的R中的GLM函数,r,stata,R,Stata,我现在正在使用Hardin和Hilbe(2007年第二版)的书《广义线性模型和推广》。作者建议,代替OLS模型,“对数链接通常用于在连续尺度上仅取正值的响应数据”。当然,他们也建议使用残差图来检查使用身份链接的“正常”线性模型是否仍然可以使用 我试图在R中复制他们在斯塔塔的书中所做的。事实上,我在STATA中对日志链接没有任何问题。但是,当使用R的glm函数调用同一个模型,但指定family=gaussian(link=“log”)时,会要求我提供起始值。当我把它们都设置为零时,我总是得到这样一

我现在正在使用Hardin和Hilbe(2007年第二版)的书《广义线性模型和推广》。作者建议,代替OLS模型,“对数链接通常用于在连续尺度上仅取正值的响应数据”。当然,他们也建议使用残差图来检查使用身份链接的“正常”线性模型是否仍然可以使用

我试图在R中复制他们在斯塔塔的书中所做的。事实上,我在STATA中对日志链接没有任何问题。但是,当使用R的glm函数调用同一个模型,但指定
family=gaussian(link=“log”)
时,会要求我提供起始值。当我把它们都设置为零时,我总是得到这样一个信息:算法没有收敛。选择其他值消息有时是相同的,但更常见的是:

Error in glm.fit(x = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  :
     NA/NaN/Inf in 'x'
正如我所说,在STATA中,我可以运行这些模型,而无需设置起始值,也不会出现错误。我尝试了许多不同的模型和不同的数据集,但问题总是一样的(除非我只包含一个独立变量)。有谁能告诉我为什么会这样,或者我做错了什么,或者为什么书中建议的模型可能不合适?谢谢你的帮助,谢谢

<>编辑:作为一个重现错误的例子,考虑可以下载的数据集。加载此数据集后,我运行以下模型:


mod我想说的是,可能是非正常的错误。如果你同意(或者更确切地说,如果数据是一致的),那么考虑这个结构:

?family
?glm
?binomial
lfit <- glm( dep <- indep1 + indep2, data=dat, family=binomial(link="probit")
您可能应该使用稍微复杂一点的模型,因为vituse显然是一个三级因素:

> mod2 <- glm(betaplasma ~ age + factor(vituse), family=quasipoisson, data=data2         )
> mod2

Call:  glm(formula = betaplasma ~ age + factor(vituse), family = quasipoisson, 
    data = data2)

Coefficients:
    (Intercept)              age  factor(vituse)2  factor(vituse)3  
       5.151076         0.006359        -0.224107        -0.562727  

Degrees of Freedom: 314 Total (i.e. Null);  311 Residual
Null Deviance:      37270 
Residual Deviance: 33380    AIC: NA 
>mod2 mod2
调用:glm(公式=betaplasma~年龄+因子(维生素),家族=quasipoisson,
数据=数据2)
系数:
(截距)年龄系数(维生素)2系数(维生素)3
5.151076         0.006359        -0.224107        -0.562727  
自由度:总共314个(即零);311剩余
零偏差:37270
剩余偏差:33380 AIC:NA

正如我在评论中所说,Stata的GLM拟合(在数值上,而不是统计意义上)可能比R更稳健。也就是说,拟合这个特定的数据集似乎并不太难

读取数据:

data2 <- read.table("http://lib.stat.cmu.edu/datasets/Plasma_Retinol",
         skip=30,nrows=315)
dnames <- c("age","sex","smokstat","quetelet","vituse","calories","fat","fiber",
           "alcohol","cholesterol","betadiet","retdiet","betaplasma","retplasma")
names(data2) <- dnames

通过将intercept参数的起始值设置为合理的值(即,接近对数刻度上的数据平均值:这两种方法中的任何一种都有效),可以很容易地使这些参数拟合

mod <- glm(betaplasma ~ age + vituse, family=gaussian(link="log"), data=data2,
           start=c(10,0,0))
mod <- glm(betaplasma ~ age + vituse, family=gaussian(link="log"), data=data2,
           start=c(log(mean(data2$betaplasma)),0,0))

使用
ggplot
绘图(这适用于
vituse
的每个值的单独行,而不是适用于加法模型)


另外两点:(1)在这个数据集中有一个值为0的响应有点奇怪——这不是不可能的,但很奇怪;(2)看起来
vituse
应该被视为一个因子,而不是数字(“1=是,相当经常,2=是,不经常,3=否”)--可能是序号。

这是R-help的交叉发布。我打算在那里回答…交叉发布没有明确禁止,但至少你应该提到你是交叉发布。
glm
可能比Stata的glm拟合代码更脆弱,但我在过去多次成功使用日志链接。你能告诉我吗u发布了一个可重复的例子[]?谢谢你的回答,并为交叉点抱歉。作为一个相对的NoB我不知道这是一个问题。作为一个例子,考虑可以下载的数据集。然后我运行下面的模型:mod,将这个注释添加到你的问题(通过编辑原始问题)是很好的。…比较实际的Stata输出和准泊松模型产生的输出会很有趣。是否也要将其添加到您的问题中?DWin,刚刚添加的输出,确实非常相似。也感谢您的努力!感谢您的回答,但是泊松模型不需要计数数据作为因变量吗?作为一个加法,根据R中的帮助文件,poisson族只接受链接
log
identity
、和
sqrt
.Ooops,应该写family=binomial(link=“probit”).Will fix。这太棒了,非常感谢您的努力!我非常喜欢生成起始值的方法,我尝试了各种随机值,但没有成功。还感谢您指出vituse应该被视为一个因素。另外,再次为交叉发布感到抱歉!
data2 <- read.table("http://lib.stat.cmu.edu/datasets/Plasma_Retinol",
         skip=30,nrows=315)
dnames <- c("age","sex","smokstat","quetelet","vituse","calories","fat","fiber",
           "alcohol","cholesterol","betadiet","retdiet","betaplasma","retplasma")
names(data2) <- dnames
par(mfrow=c(1,2),las=1,bty="l")
with(data2,plot(betaplasma~age))
with(data2,boxplot(betaplasma~vituse))
mod <- glm(betaplasma ~ age + vituse, family=gaussian(link="log"), data=data2,
           start=c(10,0,0))
mod <- glm(betaplasma ~ age + vituse, family=gaussian(link="log"), data=data2,
           start=c(log(mean(data2$betaplasma)),0,0))
summary(mod)
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  5.467575   0.218360  25.039  < 2e-16 ***
## age          0.005681   0.003377   1.682   0.0935 .  
## vituse      -0.273027   0.065552  -4.165 4.03e-05 ***
## ---
## Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
## 
## (Dispersion parameter for gaussian family taken to be 31385.26)
## 
##     Null deviance: 10515638  on 314  degrees of freedom
## Residual deviance:  9791967  on 312  degrees of freedom
## AIC: 4160.4
## 
## Number of Fisher Scoring iterations: 9

confint(mod)
##                     2.5 %      97.5 %
## (Intercept)  5.0364648709  5.87600710
## age         -0.0007913795  0.01211007
## vituse      -0.4075213916 -0.14995759
with(data2,plot(log(1+betaplasma)~age))
with(data2,boxplot(log(1+betaplasma)~vituse))
library(ggplot)
theme_set(theme_bw())
(g1 <- qplot(age,1+betaplasma,colour=factor(vituse),data=data2)+
    geom_smooth(method="lm")+
    scale_y_log10())
g1 %+% subset(data2,betaplasma>0)