2014-05-01 13 views
6

Ho il seguente codice per minimizzando la somma della deviazione usando Optim() per trovare beta0 e beta1 ma sto ricevendo i seguenti errori non sono sicuro di quello che sto facendo di sbagliato:Errore in `contrasti <-` (` * tmp * `, valore = contr.funs [1 + isOF [nn]]): i contrasti possono essere applicati solo a fattori con 2 o più livelli

sum.abs.dev<-function(beta=c(beta0,beta1),a,b) 
{ 
    total<-0 
    n<-length(b) 
    for (i in 1:n) 
    { 
    total <- total + (b[i]-beta[1]-beta[2]*a[i]) 
    } 
    return(total) 
} 
tlad <- function(y = "farm", x = "land", data="FarmLandArea.csv") 
{ 

    dat <- read.csv(data) 

    #fit<-lm(dat$farm~dat$land) 
    fit<-lm(y~x,data=dat) 
    beta.out=optim(fit$coefficients,sum.abs.dev) 

    return(beta.out) 
} 

Ecco l'errore e gli avvisi vengono ricevo:

Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
    contrasts can be applied only to factors with 2 or more levels In addition: Warning message: 
In model.response(mf, "numeric") : NAs introduced by coercion 

enter image description here

+0

Rimuovere gli argomenti di default in 'tlad' e quindi specificare le variabili senza virgolette quando si chiama la funzione. Hai anche 'dat' invece di' data' specificato nella tua chiamata 'lm'. – Thomas

+0

intendi cambiare a 'TLAD <- la funzione (y = farm, x = terreno, data = "FarmLandArea.csv") { dat <- read.csv (dati) #fit <-lm (dat $ farm ~ dat $ land) fit <-lm (y ~ x, data = dat) beta.out = optim (misura $ coefficienti, sum.abs.dev) return (beta.out) } '? –

+0

con che sto ricevendo questo? '> TLAD (fattoria, terreni, data = "FarmLandArea.csv") Visualizza Traceback Rerun con Debug Error in eval (espressione, Envir, enclos): oggetto 'fattoria' non trovato' –

risposta

5

Ci sono diversi problemi qui:

  1. si specificano variabili come stringhe di caratteri, in modo da questa linea (fit<-lm(y~x,data=dat)) è interpretato da R come fit<-lm("farm"~"land",data=dat).
  2. È più semplice non specificare le variabili predefinite nella funzione a causa di problemi di ambito.

vorrei prendere in considerazione quanto segue invece:

tlad <- function(y, x){  
    fit <- lm(y~x) 
    beta.out <- optim(fit$coefficients, sum.abs.dev) 
    return(beta.out) 
} 

dat <- read.csv("FarmLandArea.csv") 
tlad(dat$farm, dat$land)