0

コメントせずに次のコードを実行すると、gr.ascent(MMSE, 0.5, verbose=TRUE)このエラーError in b1 * x : 'b1' is missingが表示されますが、その行にコメントを付けると、これらの引数で MMSE をテストするときに次のエラーが表示されますMMSE(2,1,farmland$farm,farmland$area)。私の問題がどこにあるのか知っていますか?

Error in if (abs(t[i]) <= k) { : missing value where TRUE/FALSE needed

これが私のコードです:

farmland <- read.csv("FarmLandArea.csv")
str(farmland)
fit=lm(farm~land,data=farmland)
mean.squared.residuals <- sum((lm(farm~land,data=farmland)$residuals)^2)/(length(farmland$farm)-2)

#gradient descent

#things I should possibly use: solve(t(X)%*%X, t(X)%*%y)
gr.ascent<- function(df, x0, alpha=0.2, eps=0.001, max.it = 50, verbose = FALSE){
  X1 <- x0
  cond <- TRUE
  iteration <- 0
  if(verbose) cat("X0 =",X1,"\n")
  while(cond){
    iteration <- iteration + 1
    X0 <- X1
    X1 <- X0 + alpha * df(X0)
    cond <- sum((X1 - X0)^2) > eps & iteration < max.it
    if(verbose) cat(paste(sep="","X",iteration," ="), X1, "\n")
  }
  return(X1)
}


k=19000

#rho <- function(t, k=19000){
#  for (i in seq(1,length(t))){
#    if (abs(t[i]) <= k)
#      return(t[i]^2)
#    else 
#      return(2*k*abs(t[i])-k^2)

#  }

#}

#nicer implementation of rho. ifelse works on vector
rho<-function(t,k) ifelse(abs(t)<=k,t^2,(2*k*abs(t))-k^2)
rho.prime <- function(t, k=19000){
  out <- rep(NA, length(t))
  for (i in seq(1,length(t))){
    if (abs(t[i]) <= k)
    { print(2*t[i])
      out[i] <- 2*t[i] 
    }
    else 
    {
      print(2*k*sign(t[i]))
      out[i] <- 2*k*sign(t[i])
    }
  }
  return(out)
}
MMSE <- function(b0, b1, y=farmland$farm, x=farmland$land){
   # Calls rho.prime() here with argument y-b0-b1*x


   #Why should we call rho.prime? in the html page you have used rho!?
  n = length(y)
  total = 0
  for (i in seq(1,n)) {
    #total = total + rho(t,k)*(y[i]-b0-b1*x[i])
    total = total + rho.prime(y-b0-b1*x,k)*(y[i]-b0-b1*x[i])
  }
  return(total/n)
}

gr.ascent(MMSE(1,2), 0.5, verbose=TRUE)

FarmLand の csv データは次のようになります。

state,land,farm
Alabama,50744,14062
Alaska,567400,1375
Arizona,113635,40781
Arkansas,52068,21406
California,155959,39688
Colorado,103718,48750
Connecticut,4845,625
Delaware,1954,766
Florida,53927,14453
Georgia,57906,16094
Hawaii,6423,1734
Idaho,82747,17812
Illinois,55584,41719
Indiana,35867,23125
Iowa,55869,48125
Kansas,81815,72188
Kentucky,39728,21875
Louisiana,43562,12578
Maine,30862,2109
Maryland,9774,3203
Massachusetts,7840,812
Michigan,58110,15625
Minnesota,79610,42031
Mississippi,46907,17422
...

dput(farmland) の結果は次のとおりです。

> dput(farmland)
structure(list(state = structure(1:50, .Label = c("Alabama", 
"Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", 
"Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", 
"Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", 
"Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", 
"Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", 
"New Jersey", "New Mexico", "New York", "North Carolina", "North Dakota", 
"Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", 
"South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", 
"Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", 
"Wyoming"), class = "factor"), land = c(50744L, 567400L, 113635L, 
52068L, 155959L, 103718L, 4845L, 1954L, 53927L, 57906L, 6423L, 
82747L, 55584L, 35867L, 55869L, 81815L, 39728L, 43562L, 30862L, 
9774L, 7840L, 58110L, 79610L, 46907L, 68886L, 145552L, 76872L, 
109826L, 8968L, 7417L, 121356L, 47214L, 48711L, 68976L, 40948L, 
68667L, 95997L, 44817L, 1045L, 30109L, 75885L, 41217L, 261797L, 
82144L, 9250L, 39594L, 66544L, 24230L, 54310L, 97105L), farm = c(14062L, 
1375L, 40781L, 21406L, 39688L, 48750L, 625L, 766L, 14453L, 16094L, 
1734L, 17812L, 41719L, 23125L, 48125L, 72188L, 21875L, 12578L, 
2109L, 3203L, 812L, 15625L, 42031L, 17422L, 45469L, 95000L, 71250L, 
9219L, 734L, 1141L, 67500L, 10938L, 13438L, 61875L, 21406L, 55000L, 
25625L, 12109L, 109L, 7656L, 68281L, 17031L, 203750L, 17344L, 
1906L, 12578L, 23125L, 5703L, 23750L, 47188L)), .Names = c("state", 
"land", "farm"), class = "data.frame", row.names = c(NA, -50L
))
4

1 に答える 1

2

わかりました、数字で:

  1. あなたへの呼び出しでは、最初の引数としてfunctiongr.ascent(...)渡します。内部では、この関数を として参照します。MMSEgr.ascent(...)df(...)
  2. 関数MMSE(...)には 2 つの引数がb0ありb1、デフォルトはありません。これらを指定する必要があります。そうしないと、エラーが発生しますが、
  3. df(...)内の関数を呼び出す場合、次gr.ascent(...)の行で:X1 <- X0 + alpha * df(X0)引数を 1 つだけ渡しますb0
  4. したがって、2 番目の引数b1が欠落しているため、エラーが発生します。

MMSE(...)次のように、直接呼び出す場合:

MMSE(2,1,farmland$farm,farmland$area)

farmland$area4 番目の引数として渡します。しかし、データ フレームには列がありません。areafarmlandしたがって、これは として渡されますNA

total = total + rho.prime(y-b0-b1*x,k)*(y[i]-b0-b1*x[i])

t引数をrho.prime(...)to に強制するNAため、2 番目のエラーが発生します。

ここで何を達成しようとしているのか見当がつかないので、解決策を提案することはできません。

EDIT(OPのコメントへの応答)。

私が心から同意する@thelatemailのコメントにもかかわらず、あなたの新しいエラーはかなりあいまいです.

以前のバージョンでは、関数MSEE(...)をに渡し、gr.ascent(...)それを間違って使用していました。今回は、 にを渡します。gr.ascent(...)その値は、 を呼び出したときの戻り値ですMSEE(1,2)では、この値を次のように関数として扱おうとするとどうなるでしょうか。

X1 <- X0 + alpha * df(X0)

通常、これはdf関数ではないことを示すエラーをスローします。df この場合、機能しているのはあなたの不運です。これは F 分布の確率密度関数であり、特に必要な引数df1があります (入力?dfしてドキュメントを参照してください)。そのため、エラーが発生しています。

これを「修正」するには、次のように関数の受け渡しに戻る必要があります。

gr.ascent(MSEE,...)

次のように、内部で正しく使用しますgr.ascent(...)

X1 <- X0 + alpha * df(X0, <some other argument>).
于 2014-04-22T04:22:59.303 に答える