تعديل وظيفة LM أو LOESS لاستخدامها داخل GGPLOT2 من GEOM_SMOOTH

StackOverflow https://stackoverflow.com/questions/2370648

  •  24-09-2019
  •  | 
  •  

سؤال

أحتاج إلى تعديل lm (أو في النهاية loess) وظيفة حتى أتمكن من استخدامها في GGPLOT2 geom_smooth (أو stat_smooth).

على سبيل المثال ، هذا هو كيف stat_smooth يستخدم بشكل طبيعي:

> qplot(data=diamonds, carat, price, facets=~clarity) + stat_smooth(method='lm')`

أود تحديد العرف lm2 وظيفة لاستخدامها كقيمة ل method المعلمة في stat_smooth, ، حتى أتمكن من تخصيص سلوكها.

> lm2 <- function(formula, data, ...)
  {
      print(head(data))
      return(lm(formula, data, ...))
  }
> qplot(data=diamonds, carat, price, facets=~clarity) + stat_smooth(method='lm2')

لاحظ أنني استخدمت method='lm2' كمعلمة في stat_smooth. عندما أقوم بتنفيذ هذا الرمز ، احصل على الخطأ:

خطأ في eval (expr ، env ، explos): يحتاج 'nthcdr'

الذي لا أفهمه جيدًا. ال lm2 الطريقة تعمل بشكل جيد للغاية عند الركض خارج stat_smooth. لقد لعبت مع هذا قليلاً ولدي أنواع مختلفة من الأخطاء ، لكن بما أنني لست مرتاحًا لأدوات التصحيح من R ، فمن الصعب علي تصحيحها. بصراحة ، لا أحصل على ما يجب أن أضعه داخل return() يتصل.

هل كانت مفيدة؟

المحلول

هناك بعض الغرابة في استخدام ... كوسيطة في دعوة دالة لا أفهمها تمامًا (لها علاقة بـ ... كونها كائنًا من النوع).

فيما يلي إصدار يعمل عن طريق أخذ استدعاء الوظيفة ككائن ، وقم بتعيين الوظيفة المراد استدعاؤها إلى LM ثم تقييم المكالمة في سياق المتصل الخاص بنا. نتيجة هذا التقييم هي قيمة الإرجاع لدينا (في R قيمة التعبير الأخير في وظيفة ما هي القيمة التي تم إرجاعها ، لذلك لا نحتاج إلى صريح return).

foo <- function(formula,data,...){
   print(head(data))
   x<-match.call()
   x[[1]]<-quote(lm)
   eval.parent(x)
}

إذا كنت ترغب في إضافة وسيط إلى مكالمة LM ، فيمكنك القيام بذلك على هذا النحو:

x$na.action <- 'na.exclude'

إذا كنت ترغب في إسقاط الوسائط إلى Foo قبل الاتصال بـ LM ، فيمكنك القيام بذلك مثل هذا

x$useless <- NULL

بالمناسبة، geom_smooth و stat_smooth تمرير أي وسيطات إضافية إلى وظيفة التنعيم ، لذلك لا تحتاج إلى إنشاء وظيفة خاصة بك إذا كنت بحاجة فقط إلى تعيين بعض الوسائط الإضافية

qplot(data=diamonds, carat, price, facets=~clarity) + 
  stat_smooth(method="loess",span=0.5)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top