2014-04-12 49 views
1

我正在閱讀統計學教科書。我正在使用半官方代碼(來自其他人編寫的手冊,但鏈接到教科書的網站上)來計算示例和練習。錯誤消息「嘗試在NULL上設置屬性」R

該代碼包含擬合廣義線性模型的函​​數。我從手冊中輸入並按照建議運行。雖然實際的擬合工作,但我得到上述錯誤時,分配標籤的結果。

會拋出錯誤的代碼行是

names(fit$part) <- dn 

在這一點上,dn[1] "(Intercept)" "Var1"fit$par[1] -5.9604611 0.3165604

我看不出有任何空在那裏,奇蹟什麼可能導致錯誤。

完整的代碼是:

ct <- data.frame(alcohol.comsumption = c("0", "<1", "1-2", "3-5", ">= 6"), scores=c(0, 0.5, 1.5, 4, 7), absent = c(17066, 14464, 788, 126, 37), present = c(48, 38, 5, 1, 1)) 

n <- ct$absent + ct$present 
alc.consumption <- rep(ct$scores, n) 
y <- rep(rep(c(1,0), nrow(ct)), c(rbind(ct$present, ct$absent))) 

logitreg <- function(x, y, wt = rep(1, length(y)), intercept = T, start = rep(0, p), ...) 
{ 
    if(!exists("optim")) library(MASS) 
    fmin <- function(beta, X, y, w) { 
    p <- plogis(X %*% beta) 
    -sum(2 * w * ifelse(y, log(p), log(1-p))) 
    } 
    gmin <- function(beta, X, y, w) 
    { 
    eta <- X %*% beta; p<-plogis(eta) 
    t(-2 * (w *dlogis(eta) *ifelse(y, 1/p, -1/(1-p))))%*% X 
    } 
    if(is.null(dim(x))) dim(x) <- c(length(x),1) 
    dn <- dimnames(x)[[2]] 
    if(!length(dn)) dn <- paste("Var", 1:ncol(x), sep="") 
    p <- ncol(x) + intercept 
    if(intercept) {x <- cbind(1, x); dn <- c("(Intercept)", dn)} 
    if(is.factor(y)) y <- (unclass(y) != 1) 
    fit <- optim(start, fmin, gmin, X=x, y=y, w=wt, ...) 

    # --- Next line throws the error --- # 

    names(fit$part) <- dn 
    cat("\nCoefficients:\n"); print(fit$par) 
    cat("\nResidual Deviance:", format(fit$value), "\n") 
    cat("\nConvergence message:", fit$convergence, "\n") 
    invisible(fit) 
} 

logit.fit<-logitreg(x=alc.consumption, y=y, hessian=T, method="BFGS") 
+3

看起來像是你或者作者錯誤地將'name(fit $ par)'命名爲'names(fit $ part)',這是不存在的。 – ping

+1

@坪所以這是一些愚蠢的錯字?!謝謝你的看法,看起來統計數據的小時數也減少了我的集中能力超過我的預期:(請做出答案,你絕對應該得到輕鬆的代表 – rumtscho

+0

根據我的經驗,錯別字(和不正確的括號)是一個令人沮喪的錯誤的主要來源! – ping

回答

4

看起來像您或書的作者拼寫錯誤names(fit$par)names(fit$part),它不存在。

相關問題