10

これに関するどんな助けも本当にありがたいです。Lumleyサーベイパッケージを使用していて、コードを単純化しようとしていますが、わずかな問題が発生しています。

パッケージのsvymean関数は、私のコードでは次のように呼び出されます。最初の引数は必要な変数を示す式で、2番目の引数はそのデータセットです。

svymean(~hq_ehla, FraSvy, na.rm=TRUE)

カテゴリ変数の平均(比率)と標準誤差を引き出す関数を作成しようとしているので、次の関数を作成しました。

stats <- function(repstat, num) {
    estmean <- as.numeric(round(100 * repstat[num], digits=0))
    estse <- round(100 * sqrt(attributes(repstat)$var[num,num]), digits=1)
    return(list(mean=estmean, se=estse))
}

これは機能するので、たとえば、最初のカテゴリの平均とseを引き出すときは、次を使用します。

stats(svymean(~hq_ehla, FraSvy, na.rm=TRUE), 1)$mean
stats(svymean(~hq_ehla, FraSvy, na.rm=TRUE), 1)$se

私ができるようにしたいのは、これをはるかに短いものに単純化することです。

stats(FraSvy, "hq_ehla", 1)$mean

またはそのようなもの。問題は、変数名を使用して数式を関数に渡す方法がわからないことです。

4

2 に答える 2

14

を使用reformulateして式を作成し、関数内で呼び出すことができsvymeanます。または他の引数を...に渡すために使用しますna.rmsvymean

stats <- function(terms, data,  num, ...) {
  .formula <- reformulate(terms)
  repstat <- svymean(.formula, data, ...)
  estmean <- as.numeric(round(100 * repstat[num], digits=0))
  estse <- round(100 * sqrt(attributes(repstat)$var[num,num]), digits=1)
  return(list(mean=estmean, se=estse))
}

stats(data = FraSvy, terms = "hq_ehla", 1, na.rm = TRUE)$mean

プログラムで数式オブジェクトを作成する方法の詳細については、この回答をご覧ください

または、関数内で数式オブジェクトを渡すこともできます。

stats2 <- function(formula, data,  num, ...) {

  repstat <- svymean(formula, data, ...)
  estmean <- as.numeric(round(100 * repstat[num], digits=0))
  estse <- round(100 * sqrt(attributes(repstat)$var[num,num]), digits=1)
  return(list(mean=estmean, se=estse))
}


stats2(data = FraSvy, formula = ~hq_ehla, 1, na.rm = TRUE)$mean
于 2013-02-03T23:59:43.043 に答える
0

coefと関数はSEあなたの人生を楽にするかもしれません。

# construct a function that takes the equation part of svymean as a string
# instead of as a formula.  everything else gets passed in the same
# as seen by the `...`
fun <- function( var , ... ) svymean( reformulate( var ) , ... )

# test it out.
result <- fun( "hq_ehla" , FraSvy , na.rm = TRUE )

# print the results to the screen
result

# also your components
coef( result )
SE( result )

# and round it
round( 100 * coef( result ) )
round( 100 * SE( result ) )
于 2013-02-04T06:43:42.257 に答える