2017-02-12 11 views
1

私はR Data Analysis Examples: Ordinal Logistic Regressionを序論的ロジスティック回帰(最終的にはrpy2インターフェースを使用したPython)で行うためのガイドとして使用しています。彼らは式を用いて予測推定値のテーブルを作成し、比例オッズ仮定をテストする段階でfun =サマリー関数の引数のR

:私が気づい

(s <- with(dat, summary(as.numeric(apply) ~ pared + public + gpa, fun=sf))) 

一つは、funであった場合fun =引数の振る舞いが異なっていたということです上部ケース。理由を調べるには、ここでソースを調べました:summary.R source、ただしFUN =が見つかりました。

UCLAサイトによると(上記のリンク)、「式の引数を指定してサマリを呼び出すと、式の左側の変数の説明統計が右側のグループで計算されますデフォルトではサマリーは左側の変数の平均を計算しますが、私たちは独自の関数、つまりsfをfun=引数に指定することで平均の計算をオーバーライドできます。最後のコマンドは、Rに内容をテーブルであるオブジェクトsに返すように要求します。

私はこれが何をしているのか理解していますが、引数fun =がソースコードのどこにあるのかわかりません(FUNはデフォルトのようですが、数式の左側に関数sfは無視されています)。このオーバーライドはどこにありますか?そして、これは実際にいくつかの場所を文書化されていますか?もしそうなら、それは明らかにヘルプドキュメントではないからです。私がRのソースを見たのはこれが初めてのことなので、私は無知だと自由に認めます。

私はこれを掘り下げるています理由はrpy2での動作はRでR.、両方fun =FUN =農産物出力のものと一致していないが、rpy2で、唯一FUN =は出力を生成することです。 fun =がエラーを投げますRRuntimeError: Error in as.character(substitute(fun)) : cannot coerce type 'closure' to vector of type 'character'

したがって、なぜこれが期待どおりに機能していないのかを知る必要があります。

from rpy2.robjects import pandas2ri 
import rpy2.robjects as ro 
from rpy2.robjects.packages import importr 
pandas2ri.activate() 
gms = importr("gms.test") 
hmisc = importr('Hmisc') 
base = importr('base', robject_translations={'with': '_with'}) 
stats = importr('stats', robject_translations={'format_perc': '_format_perc'}) 

r_consult_case_control = pandas2ri.py2ri(consult_case_control) 
formula = stats.as_formula('es_score ~ n + raingarden + consult_case') 

formula.getenvironment()['es_score'] = r_consult_case_control.rx2('es_score') 
formula.getenvironment()['n'] = r_consult_case_control.rx2('n') 
formula.getenvironment()['raingarden'] = r_consult_case_control.rx2('raingarden') 
formula.getenvironment()['consult_case'] = r_consult_case_control.rx2('consult_case') 

# succeeds: 
base._with(r_consult_case_control, ro.r.summary(formula, FUN=gms.sf)) 

# fails with given error: 
base._with(consult_case_control, ro.r.summary(formula, fun=gms.sf)) 

てください:

EDIT

成功と失敗、それぞれPythonのライン(Iは、機能/クロージャ平方フィートを含む、gms.testと呼ばれるRでパッケージを作成しました)このコードのデバッグは私がこの質問で意図したものではないことに注意してください。私はちょうどRのfunオーバーライドが何をしていたのかを見たいと思っていました。

+0

成功して失敗する* FUN *と* fun * Pythonの両方の行を投稿してください。 – Parfait

+0

上記の編集を完了しましたが、それはこの質問の意図ではありませんでした(これが私がそれを含めなかった理由です)。 'summary'メソッドの' fun'オーバーライドのRコードを知りたいと思いました。私は何が起こっているのか理解しています.Rはクロージャー 'sf'を文字列に強制しようとしています。なぜそれをしようとしているのかは、私が知りたいものです。 –

+0

うーん...あなたのパッケージにアクセスできないから。 'ro.r.summary()'と 'base.summary()'を使って、エラーなしで* FUN *と* fun *の両方に ''平均 ''を使用しました。だから、再現できません。これは 'gm.sf'に関するものでなければなりません。 RまたはPythonの名前の競合を使用している可能性があります。 – Parfait

答えて

0

ソースを取得するのは簡単です。 how to view R sourceあたりとして、私はちょうど getAnywhere(summary.formula)を実行し、コードの関連するブロックを得た:デフォルトfunが使用されていない場合

if (length(fun)) { 
    if (length(de <- deparse(fun)) == 2) { 
     de <- as.list(fun) 
     de <- as.character(de[[length(de)]]) 
     funlab <- if (de[1] == "apply") 
      de[length(de)] 
     else de[1] 
    } 
    else funlab <- as.character(substitute(fun)) 
} 

したがって、それは私がエラーWRTを取得しておく理由は文字ベクトルに変換しようとしますクロージャ強制。 Rでは、as.character(sf)FUN、btwは、私たちがfunでない引数が同じ振る舞いを持つため、赤いニシンでした)というエラーを再現できます。オイ、これは本当に楽しいことではありません!

+0

まあ、私はそれは半分arsedソリューションですが、それは働いている種類の。私は、PandasデータフレームをiPythonのrmagicにインポートしてから、magicコマンドを使って要約結果テーブルを取得することができます。これはRでの文字への変換をうまくやることができるので、これは理にかなっていると思います。 –

+0

私はこれを答えとして受け入れるつもりです。たとえこれを直接Pythonで動かすことができたとしても、私はRでmagicコマンドを使って素敵な要約テーブルの書式を失います(テーブルオブジェクトをPythonに戻して良い主よ、それは醜いです!)。後に移動する時間... –

関連する問題