web-dev-qa-db-ja.com

`contrasts <-`(` * tmp * `、value = contr.funs [1 + isOF [nn]])のエラー:対比は2つ以上のレベルの因子にのみ適用できます

Optim()を使用してbeta0とbeta1を見つけるために偏差の合計を最小化するための次のコードがありますが、次のエラーが表示されます。何が間違っているのかわかりません。

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

エラーと警告は次のとおりです。

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

6
Mona Jalal

ここにはいくつかの問題があります。

  1. 変数を文字列として指定しているため、この行(fit<-lm(y~x,data=dat))はRによってfit<-lm("farm"~"land",data=dat)として解釈されます。
  2. スコープの問題があるため、関数でデフォルト変数を指定しない方が簡単です。

代わりに、次のことを検討します。

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)
5
Thomas